我想保留每个未缠绕文档的原始数组字段。
示例:在展开乐队的members数组时,我想保留每个文档的原始members数组,以便我可以引用其他member
{ 'name': 'the crazies', 'member': 'Tom', 'othermembers': [ 'Tom', 'Mike', 'Sally' ] }
{ 'name': 'the crazies', 'member': 'Mike', 'othermembers': [ 'Tom', 'Mike', 'Sally' ] }
{ 'name': 'the crazies', 'member': 'Sally', 'othermembers': [ 'Tom', 'Mike', 'Sally' ] }
最终,成员数组不应在“名称”字段中包含成员的名称,但是如果有人有任何想法,我将尽我所能。
一种有效的方法是根据乐队ID对其本身进行$ lookup,但看起来有些笨拙。
band.aggregate()
.match( 'whatever criteria' )
.lookup({ from: 'bands', localField: '_id', foreignField: '_id', as 'othermembers')
.unwind({ path: 'members')
.project({
'name': 1
'member': '$members.name',
'othermembers.members.name': 1;
})
想法?
答案 0 :(得分:0)
在展开成员数组之前,将成员数组项目作为两个新字段,然后展开这两个新字段中的任何一个。例如
{
"_id" : ObjectId("5c5ca7184ef14365b786e11f"),
"a" : [
10,
20,
30
],
"b" : "hello"
}
对于以上数据,我正在使用以下查询
db.testColl.aggregate([
{$project: {old_arr: "$a", new_arr: "$a"}},
{$unwind: {path: "$old_arr"}}
])
我得到的结果是
{
"_id" : ObjectId("5c5ca7184ef14365b786e11f"),
"old_arr" : 10,
"new_arr" : [
10,
20,
30
]
}
{
"_id" : ObjectId("5c5ca7184ef14365b786e11f"),
"old_arr" : 20,
"new_arr" : [
10,
20,
30
]
}
{
"_id" : ObjectId("5c5ca7184ef14365b786e11f"),
"old_arr" : 30,
"new_arr" : [
10,
20,
30
]
}
因此,将取消old_arr字段,但是对于每个文档,您将拥有带有所有值的new_arr字段。