mongodb - 如何使用查找从 2 个不同的集合中获取数据,以及如何在查找中添加一些条件以根据某些条件获取数据?
问题描述
我有两个集合,如下所示:
第一集:
[{
"UID" : 3398,
"name" : "test"
}]
第二集:
[{
"ques_id" : "q1",
"ri_score" : 5.3,
"uc_id" : 3398
},
{
"ques_id" : "q2",
"ri_score" : 5.3,
"uc_id" : 3398
}]
我正在使用的查询如下:
db.first_collection.aggregate([
{
$lookup: {
from: "second_collection",
localField: "UID",
foreignField: "uc_id",
as: "second_collection_docs"
}
},
{
$project: {
"UID": 1,
"name": 1,
"second_collection_docs.ri_score": 1
}
}
])
上述查询返回的数据如下所示:
{
"UID" : 3394,
"name" : "test",
"second_collection_docs" : [{
"ri_score" : "5.3"
},
{
"ri_score" : "5.3"
}]
}
在第二个收集数据中,它给出了 2 次相同的 ri_score,但我只想要一次。预期结果如下所示:
{
"UID" : 3394,
"name" : "test",
"second_collection_docs" : [{
"ri_score" : "5.3"
}]
}
有什么解决方案可以让我得到预期的结果吗?先感谢您。
解决方案
也许这可以使用$addFields
and工作$reduce
:
db.first_collection.aggregate([
{}, //lookup stage
{}, // project stage
//Above the same query you have and here insert this stage
{
"$addFields": {
"values": {
"$reduce": {
"input": "$values",
"initialValue": [],
"in": {
"$cond": [
{
"$in": [
"$$this.ri_score",
"$$value.ri_score"
]
},
"$$value",
{
$concatArrays: [
"$$value",
[
"$$this"
]
]
}
]
}
}
}
}
}
])
基本上,这个查询添加的字段values
是一个包含ri_score
不重复对象的数组。
检查这个示例,其中我添加了另一个不同的对象,ri_score
并检查它是否按预期工作。
还有一个你的价值观的例子是here。如您所见,ri_score
不重复。
推荐阅读
- c# - 使用 c# 中的文本文件替换 pubxml 中的参数
- html - Bootstrap 和 Laravel 列在移动版本上中断
- amazon-web-services - 无法访问正在运行的实例上的域
- php - PHP 将数组数据导出到 CSV 中的数据列中
- r - 将两个数据帧与条件进行比较
- python - Python - 在字典中查找列表的总和,然后找到具有最低值的列表
- python - 用 Python 打破子列表
- pdf - Firefox 的 about:config 在 Android 上用于设置 pdf 应用程序
- javascript - SASS:嵌套图像滑块
- c++ - Sqrt、cos、sin 没有在这个范围内声明?