MongoDB $ unwind并在每个未展开的文档中保留数组字段以供参考

时间:2019-02-14 21:22:47

标签: node.js mongodb mongoose

我想保留每个未缠绕文档的原始数组字段。

示例:在展开乐队的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;
})

想法?

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字段。