如何解决我想在数组中聚合到数组 mongodb
我有三个不同的集合,每个表都与唯一的 objectid 相连。 这是mongodb数据库..
collection1 => cate = {
"_id" : ObjectId("5ff98328dcb22e2f9fd23835"),"name" : "home & kitchen"
},{
"_id" : ObjectId("5ff98328dcb22e2f9fd23836"),"name" : "shoes"
}
collection2 => subcate = {
"_id" : ObjectId("5ff9837ddcb22e2f9fd23890"),"cate" : ObjectId("5ff98328dcb22e2f9fd23835"),"name" : "dish"
},{
"_id" : ObjectId("5ff9837ddcb22e2f9fd23891"),"name" : "dish 2"
}
collection3 => petacate ={
"_id" : ObjectId("5ff983abdcb22e2f9fd238c8"),"subcate" : ObjectId("5ff9837ddcb22e2f9fd23890"),"name" : "small dish"
},{
"_id" : ObjectId("5ff983abdcb22e2f9fd238c7"),"name" : "big dish"
}
我更擅长这种语言,我想要这种类型的结果。我正在尝试解决这个问题,但我不能。
collection1 _id
与 collection2 cate
相连,collection1 和 collection2 都以 cate
& subcate
的顺序与 collection3 相连
cat: {
_id: "5ff98328dcb22e2f9fd23835",name: "home & kitchen",subcate: [
{
_id: "5ff9837ddcb22e2f9fd23890",cate: "5ff98328dcb22e2f9fd23835",name: "dish",petacate: [
{
_id: "5ff983abdcb22e2f9fd238c8",subcate: "5ff9837ddcb22e2f9fd23890",name: "small dish"
},{
_id : ObjectId("5ff983abdcb22e2f9fd238c7"),subcate : ObjectId("5ff9837ddcb22e2f9fd23890"),cate : ObjectId("5ff98328dcb22e2f9fd23835"),name : "big dish"
}
]
}
]
}
解决方法
加入收藏时必须使用$lookup
。有两种查找方式。两者都在这里使用。
- 第一个
$lookup
是加入集合的standard lookup,条件是_id
的{{1}}等于cate
的{{1}} -
cate
来解构数组。 (数组到对象) - second
subcate
是使用多个条件的 uncorrelated lookup。当您使用这种查找时,您需要在$unwind
阶段使用$lookup
。使用$expr
,我们有条件地检查了$match
和$match
。 -
subcate
是重构解构后的数组
这是脚本
cate
更新 1
$group
默认行为是在数组为 null 或为空时删除。为了防止它,我们做
db.cate.aggregate([
{
"$lookup": {
"from": "subcate","localField": "_id","foreignField": "cate","as": "subcate"
}
},{ "$unwind": "$subcate" },{
"$lookup": {
"from": "petacate","let": { cId: "$subcate.cate",sId: "$subcate._id"},"pipeline": [
{
$match: {
$expr: {
$and: [
{ $eq: [ "$subcate","$$sId" ] },{ $eq: [ "$cate","$$cId" ] },]
}
}
}
],"as": "subcate.petacate"
}
},{
"$group": {
"_id": "$_id","name": { "$first": "$name" },"subcate": { $push: "$subcate" }
}
}
])
注意:这可能会根据以下阶段生成空数组或空对象。如果不需要,使用 $unwind
和条件删除空数组或对象
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。