考虑到我有2个收藏夹。
调用的第一个origin
文件包含以下文档(不包括_id
):
[
{
"Id": "1",
"Level1": [
{
"Id": "1.1",
"Level2": [
{
"Level3": {
"Id": "1.1.1",
"Name": "name 1.1.1"
}
},
{
"Level3": {
"Id": "1.1.2",
"Name": "name 1.1.2"
}
}
]
},
{
"Id": "1.2",
"Level2": [
{
"Level3": {
"Id": "1.2.1",
"Name": "name 1.2.1"
}
},
{
"Level3": {
"Id": "1.2.2",
"Name": "name 1.2.2"
}
}
]
}
]
},
{
"Id": "2",
"Level1": [
{
"Id": "2.1",
"Level2": [
{
"Level3": {
"Id": "2.1.1",
"Name": "name 2.1.1"
}
},
{
"Level3": {
"Id": "2.1.2",
"Name": "name 2.1.2"
}
}
]
},
{
"Id": "2.2",
"Level2": [
{
"Level3": {
"Id": "2.2.1",
"Name": "name 2.2.1"
}
},
{
"Level3": {
"Id": "2.2.2",
"Name": "name 2.2.2"
}
}
]
}
]
}
]
调用第二个集合,destination
并具有以下文档:
[
{
"Id": "f1",
"Level1": {
"Level2": {
"Id": "1.1.1",
"Name": "name 1.1.1"
}
}
},
{
"Id": "f2",
"Level1": {
"Level2": {
"Id": "1.1.2",
"Name": "name 1.1.2"
}
}
},
{
"Id": "f3",
"Level1": {
"Level2": {
"Id": "1.2.1",
"Name": "name 1.2.1"
}
}
},
{
"Id": "f4",
"Level1": {
"Level2": {
"Id": "1.2.2",
"Name": "name 1.2.2"
}
}
},
{
"Id": "f5",
"Level1": {
"Level2": {
"Id": "2.1.1",
"Name": "name 2.1.1"
}
}
},
{
"Id": "f6",
"Level1": {
"Level2": {
"Id": "2.1.2",
"Name": "name 2.1.2"
}
}
},
{
"Id": "f7",
"Level1": {
"Level2": {
"Id": "2.2.1",
"Name": "name 2.2.1"
}
}
},
{
"Id": "f8",
"Level1": {
"Level2": {
"Id": "2.2.2",
"Name": "name 2.2.2"
}
}
}
]
Level1.Id = "1.1"
上 origin
给定一个Level1.Id = "1.1"
onorigin
集合,我想从destination
集合中获取文档列表,其中:
Level1.Level2.Level3 in
origin
= Level1.Level2 in
destination
来自的聚合查询origin
应“收集”所有Level1.Level2.Level3
对象(在匹配项下Level1.Id
),并使用此数组来标识destination
集合中的文档。
预期结果是:
[
{
"Id": "f1",
"Level1": {
"Level2": {
"Id": "1.1.1",
"Name": "name 1.1.1"
}
}
},
{
"Id": "f2",
"Level1": {
"Level2": {
"Id": "1.1.2",
"Name": "name 1.1.2"
}
}
}
]
如何使用聚合查询完成此任务?
在MongoDB中,要聚合我们$lookup
用于此操作的不同集合中的数据,请在此处了解有关查找的更多信息。
我已经根据您的要求完成了查询查询。
db.origin.aggregate([
{
$unwind:"$Level1"
},
{
$unwind:"$Level1.Level2"
},
{
$lookup:{
from:"destination",
let:{
"level":"$Level1.Level2.Level3"
},
pipeline:[
{
$match:{
$expr:{
$eq:[
"$Level1.Level2","$$level"
]
}
}
}
],
as:"lookups"
}
},
{
$unwind:{
path:"$lookups",
preserveNullAndEmptyArrays:true
}
}
]).pretty()
并且,要在输出中显示所需的字段,可以使用$project
。更多信息请点击这里。
希望对你有帮助 :)
更新
db.destination.aggregate([
{
$lookup:{
from:"origin",
let:{
"level":"$Level1.Level2"
},
pipeline:[
{
$unwind:"$Level1"
},
{
$unwind:"$Level1.Level2"
},
{
$match:{
$expr:{
$eq:[
"$Level1.Level2.Level3","$$level"
]
}
}
}
],
as:"lookups"
}
},
{
$unwind:{
path:"$lookups",
preserveNullAndEmptyArrays:true
}
},
{
$project:{
"Id":1,
"Level1.Level2":"$lookups.Level1.Level2.Level3"
}
}
]).pretty()
输出量
[
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f67"),
"Id" : "f1",
"Level1" : {
"Level2" : {
"Id" : "1.1.1",
"Name" : "name 1.1.1"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f68"),
"Id" : "f2",
"Level1" : {
"Level2" : {
"Id" : "1.1.2",
"Name" : "name 1.1.2"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f69"),
"Id" : "f3",
"Level1" : {
"Level2" : {
"Id" : "1.2.1",
"Name" : "name 1.2.1"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f6a"),
"Id" : "f4",
"Level1" : {
"Level2" : {
"Id" : "1.2.2",
"Name" : "name 1.2.2"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f6b"),
"Id" : "f5",
"Level1" : {
"Level2" : {
"Id" : "2.1.1",
"Name" : "name 2.1.1"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f6c"),
"Id" : "f6",
"Level1" : {
"Level2" : {
"Id" : "2.1.2",
"Name" : "name 2.1.2"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f6d"),
"Id" : "f7",
"Level1" : {
"Level2" : {
"Id" : "2.2.1",
"Name" : "name 2.2.1"
}
}
},
{
"_id" : ObjectId("5e92196a3a5a7fc48b644f6e"),
"Id" : "f8",
"Level1" : {
"Level2" : {
"Id" : "2.2.2",
"Name" : "name 2.2.2"
}
}
}
]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句