9

如果像 {conditionB:1} 这样的条件并添加像 ts_imported 这样的时间戳 - 在不知道原始文档中包含的详细信息的情况下,如何简单地从 collectionABC 复制文档并将它们复制到 collectionB 中?

我找不到类似于 mysql 的 mongodb 的简单等价物INSERT ... SELECT ...

4

4 回答 4

17

您可以使用 mongoshell 中的 javascript 来实现类似的结果:

db.collectionABC.find({ conditionB: 1 }).
forEach( function(i) { 
  i.ts_imported = new Date();
  db.collectionB.insert(i);
});
于 2012-11-23T19:20:23.353 回答
12

我意识到这是一个老问题,但是......现在有更好的方法。MongoDB 现在有一个叫做聚合管道的东西(v 3.6 及更高版本,也许还有一些旧的——我还没有检查过)。聚合管道允许您执行更复杂的操作,例如执行连接、添加字段以及将文档保存到不同的集合中。对于 OP 的情况,管道如下所示:

var pipeline = [
    {$match: {conditionB: 1}},
    {$addFields: {ts_imported: ISODate()}},
    {$out: 'collectionB'}
]
// now run the pipeline
db.collectionABC.aggregate(pipeline)

相关文档:

于 2019-01-28T21:58:32.607 回答
1

Mongodb 没有那种查询能力,您可以(在查询内部)根据第一个集合中的变量插入另一个集合。

您需要先将该文档拉出,然后对其进行操作。

从技术上讲,您可以为此使用 MR,但我觉得它不适用于您的场景。

于 2012-11-23T18:54:08.640 回答
0

似乎这在序列生成的上下文中有效 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

于 2013-11-01T10:12:46.473 回答