在同一集合中复制Mongo记录

3

在MongoDB中,我有一个包含记录的集合。这些记录非常复杂。现在,我想要复制其中的一条记录。

我可以轻松地选择其中一条记录。

mongo> var row = db.barfoo.find({"name":"bar"});

现在我其实不知道该怎么办。我不知道row里面有什么,因为我找不到打印它内容的方法。我应该怎样修改特定属性并最终重新插入这一行。

mongo> db.barfoo.insert(row);

谢谢。
2个回答

7

您需要更改 _id 的值 - 生成新的:

var row = db.barfoo.findOne({"name":"bar"});
row._id = ObjectId();
db.barfoo.insert(row);

祝你好运!


2
如果缺少 _id 属性,Mongo 会自动创建它。我认为你不必像这样手动创建 - 请参见此处 - Lix
@Lix 我正在使用Mongo 3.2.8,我需要创建_id才能使其正常工作。 - chakeda

1
我假设你正在直接使用mongo shell进行工作。
一旦你有了你的文档(不是行:P),你可以像修改普通JavaScript对象一样修改属性:
var doc = db.barfoo.findOne( { "name": "bar" } );
doc.name = "Mr Bar";

请注意 find() 命令 返回一个游标,因此如果您想提取单个文档,则应使用 findOne() 函数。该函数返回单个文档。
如果您想复制多个文档,可以使用 find() 函数并迭代游标以检索每个文档:
db.barfoo.find( { "name": "bar" } ).forEach( function( doc ){
  doc.name = "Mr Bar";
}

在更改相关属性后,您可以使用 insert / save 方法将数据持久化到MongoDB中。不要忘记更改/删除 _id 属性,以便您实际创建一个新文档。
作为一个旁注,在mongo shell中查看对象的内容,您可以使用print()函数。如果您想要更加视觉上吸引人的输出,可以使用printjson()

1
“find” 不是返回一个游标吗?他应该通过迭代来实际获取名称(或记录),不是吗? - martskins
@lascort - 啊,是的.. 你是正确的。感谢您的反馈! - Lix
1
我确定你是指 findOne 而不是 find_one :P - martskins
@lascort 哎呀呀!!!频繁切换编程语言总是让我困扰!你对于那些踩你的帖子非常有耐心啊 ;) - Lix
我有一个变量,其中包含大量文档。当我对其执行forEach操作时,它会完全崩溃并返回空值,而没有任何错误信息,并且擦除了先前包含文档数组的变量的内容。 - Aymon Fournier
嗨@AymonFournier - 如果您有不同的问题,请创建一个新帖子。 - Lix

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