如果像 {conditionB:1} 这样的条件并添加像 ts_imported 这样的时间戳 - 在不知道原始文档中包含的详细信息的情况下,如何简单地从 collectionABC 复制文档并将它们复制到 collectionB 中?
我找不到类似于 mysql 的 mongodb 的简单等价物INSERT ... SELECT ...
您可以使用 mongoshell 中的 javascript 来实现类似的结果:
db.collectionABC.find({ conditionB: 1 }).
forEach( function(i) {
i.ts_imported = new Date();
db.collectionB.insert(i);
});
我意识到这是一个老问题,但是......现在有更好的方法。MongoDB 现在有一个叫做聚合管道的东西(v 3.6 及更高版本,也许还有一些旧的——我还没有检查过)。聚合管道允许您执行更复杂的操作,例如执行连接、添加字段以及将文档保存到不同的集合中。对于 OP 的情况,管道如下所示:
var pipeline = [
{$match: {conditionB: 1}},
{$addFields: {ts_imported: ISODate()}},
{$out: 'collectionB'}
]
// now run the pipeline
db.collectionABC.aggregate(pipeline)
相关文档:
Mongodb 没有那种查询能力,您可以(在查询内部)根据第一个集合中的变量插入另一个集合。
您需要先将该文档拉出,然后对其进行操作。
从技术上讲,您可以为此使用 MR,但我觉得它不适用于您的场景。