MongoDB 外壳 : Join a single field from another collection

标签 mongodb

我有一个收藏点:

- spotId
- name

和代码:

- codeId
- spotId
- code

我要介绍的领域

- spotName

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

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

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

最佳答案

如果你想获得一种在每个文档中都得到 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'
 }}

]

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

如果您确实想对集合执行更新,唯一的方法是编写一个find,它遍历代码中的所有文档,然后一旦它得到文档,它使用 findOne 在 Spots 中搜索文档,然后发出更新语句。

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) {})
  })
});

关于MongoDB 外壳 : Join a single field from another collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40179541/

相关文章:

mongodb - Meteor:如何使用 _id 字段将一个集合中的字段填充到另一个集合中?

c# - 如何从 C# Mongodb 强类型驱动程序中的文档加载特定字段

javascript - MongooseServerSelectionError: 连接 ECONNREFUSED::1:27017

angularjs - ExpressJS和AngularJS路由问题

ruby-on-rails-3 - Mongoid 相同的嵌入式文档类型用于不同的领域

javascript - 如何有效地将多个集合聚合为一个集合

MongoDB mergeObjects 求和而不是替换

javascript - MongoDB 中的 "Generic Collection"?

javascript - Mongoose : $where unequal

node.js - AWS elastic beanstalk Node.js 应用程序未连接到 Mongodb atlas