如何从具有相似字段值的多个集合中查找文档
How to find documents from multiple collection with similar field value
我有两个合集:
产品
{ id: "1", model: "Light1", category: "Light"},
{ id: "2", model: "Light3", category: "Light"},
{ id: "3", model: "Lock1", category: "Lock"},
项目
{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "2", model: "Light2", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}
{ id: "5", model: "Lock2", category: "Lock", color: "Blue"},
我想从包含产品集合中的模型和类别的项目集合中查找文档。
从上面的例子中,我想得到这个所谓的新集合:
{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}
您可以试试这个聚合查询:
- 第一个
$lookup
从项目集合中加入集合。此查找使用匹配所需值的管道:本地 model
等于外部 model
,本地 category
等于外部 category
。这将生成一个数组作为输出:如果没有任何匹配项,则该数组将为空。
- 所以你可以
$match
不显示空result
数组。
- 并使用
$project
输出你想要的值。
db.Item.aggregate([
{
"$lookup": {
"from": "Product",
"let": {
"model": "$model",
"category": "$category"
},
"pipeline": [
{
"$match": {
"$and": [
{
"$expr": {
"$eq": [
"$model",
"$$model"
]
}
},
{
"$expr": {
"$eq": [
"$category",
"$$category"
]
}
}
]
}
}
],
"as": "result"
}
},
{
"$match": {
"result": {
"$ne": []
}
}
},
{
"$project": {
"_id": 0,
"result": 0
}
}
])
示例here
我有两个合集:
产品
{ id: "1", model: "Light1", category: "Light"},
{ id: "2", model: "Light3", category: "Light"},
{ id: "3", model: "Lock1", category: "Lock"},
项目
{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "2", model: "Light2", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}
{ id: "5", model: "Lock2", category: "Lock", color: "Blue"},
我想从包含产品集合中的模型和类别的项目集合中查找文档。
从上面的例子中,我想得到这个所谓的新集合:
{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}
您可以试试这个聚合查询:
- 第一个
$lookup
从项目集合中加入集合。此查找使用匹配所需值的管道:本地model
等于外部model
,本地category
等于外部category
。这将生成一个数组作为输出:如果没有任何匹配项,则该数组将为空。 - 所以你可以
$match
不显示空result
数组。 - 并使用
$project
输出你想要的值。
db.Item.aggregate([
{
"$lookup": {
"from": "Product",
"let": {
"model": "$model",
"category": "$category"
},
"pipeline": [
{
"$match": {
"$and": [
{
"$expr": {
"$eq": [
"$model",
"$$model"
]
}
},
{
"$expr": {
"$eq": [
"$category",
"$$category"
]
}
}
]
}
}
],
"as": "result"
}
},
{
"$match": {
"result": {
"$ne": []
}
}
},
{
"$project": {
"_id": 0,
"result": 0
}
}
])
示例here