如何在MongoDB中基于另一个集合更新集合?

28

现在我有两个集合:coll01coll02

coll01的结构如下:

{
  id: 01,
  name: "xxx",
  age: 30
}

coll02的结构如下:

{
  id: 01,
  name: "XYZ"
  gender: "male"
}

这两个集合中的两个ID字段都是索引。并且这两个集合中文档的数量相同。

我想在传统SQL中做的是:

update coll01, coll02
set coll01.name = coll02.name
where coll01.id = coll02.id

这是Mongo的一个非常常见的用例。当从SQL转换到Mongo时,通常需要使用Mongo ObjectIDs更新int IDs。我不关心你正在处理什么数据 - 所有数据都是相关的和关联的。人员文档(以及子文档)必须以某种方式与订单文档相关联。 - David Betz
1个回答

45

Mongodb不是关系型数据库,也不支持联接操作。因此,你应该仔细思考一下,你是否真的需要mongodb来实现你的目的?

更新的解决方案:你可以在循环中更新coll01中的每个文档:

db.coll01.find().forEach(function (doc1) {
    var doc2 = db.coll02.findOne({ id: doc1.id }, { name: 1 });
    if (doc2 != null) {
        doc1.name = doc2.name;
        db.coll01.save(doc1);
    }
});

coll02集合中,为id字段创建索引可以减少循环内部的find()操作执行时间。 此外,还可以查看有关服务器端JavaScript执行的信息:通过mongo shell实例在服务器上运行.js文件


兄弟,查询中缺少一个$符号。 - G1P
2
你应该使用findOne而不是find,因为find返回所选文档的游标。 - Soren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接