MongoDB Shell:加入另一个集合中的单个字段

obi*_*ahn 2 mongodb

我有一个收藏点:

- spotId
- name
Run Code Online (Sandbox Code Playgroud)

和代码:

- codeId
- spotId
- code
Run Code Online (Sandbox Code Playgroud)

我要介绍领域

- spotName
Run Code Online (Sandbox Code Playgroud)

到代码(并通过 spotId 加入)。

如何更新 mongo shell 中的所有现有文档?

当我尝试 $lookup 时,我总是得到整个 Spot 文档,而不仅仅是名称字段。

hya*_*des 5

如果您想spotName在每个文档中获得一种格式,您可以使用聚合管道。$lookup是一个好的开始。在这里它生成完整的数组,你可以$unwind和项目必要的东西

[{$lookup: {
        from: 'Spots',
        localField: 'spotId',
        foreignField: 'spotId',
        as: 'new_field'
    }},
{$unwind: '$new_field'},
{$project: {
    codeId: 1,
    spotId: 1,
    code: 1,
    spotName: '$new_field.name'
 }}

]
Run Code Online (Sandbox Code Playgroud)

如果您只需要使用结果,则上面的解决方案代表了这种情况。

如果您确实想对update集合执行 an ,唯一的方法是编写一个find遍历 Codes 中所有文档的a ,然后一旦它获取该文档,它就会使用 搜索 Spots 中的文档findOne,然后发出更新语句。

Codes.find().each(function(err, doc) {
  Spots.findOne({spotId: doc.spotId}, function (err, item) {
    Codes.update({codeId: doc.codeId}, {$set: {spotName: item.name}}, function (err, res) {})
  })
});
Run Code Online (Sandbox Code Playgroud)