我正在尝试从命令行执行以下操作:
可以从命令行完成吗?我只能看到修改文档的方法,这很好,但我需要先复制它们。是否有可以查找,复制,修改然后查找下一个的脚本?
答案 0 :(得分:0)
我认为你可以实现像这样的脚本:
var cursor = db.mycollection.find({ **criteria** } );
while (cursor.hasNext()) {
var x = cursor.next();
var field1 = x.field1;
// Perform the changes
.
.
var field1T = field1.replace(/aaa/g, 'a');
.
.
x.field1 = field1T;
// this will create a dup
delete x._id // I'm not sure if it's delete or unset. I can't test now
db.mycollection.insert(x);
};
然后调用它
# mongo localhost/mydatabase myscript.js
答案 1 :(得分:0)
在复制文档时,您必须记住它们具有不同的_id(它类似于主键)。您不能在具有相同_id的集合中拥有两个文档,这对于每个文档都必须是唯一的(通用数据库概念)。
现在您可以轻松复制,如:
假设您有这样的文档结构
{_id:'12345', x:1, y:2} // assumption
现在你可以这样做:
搜索集合中的某个文档 - >
var doc = db.YOUR_COLLECTION_NAME.find({_id:'12345'});
复制每个找到的文档 - >
doc._id = '54321'; //change the _id
db.YOUR_COLLECTION_NAME.insert(doc); //duplicated
以相同的方式修改每个找到的文档
如果要修改重复文档,请在插入之前执行此操作。在第2步。
现在对于许多文档,创建一个名为 dup.js 的文件(假设),在其中写下:
var cur = db.YOUR_COLLECTION_NAME.find({QUERY_HERE});
while(cur.hasNext()){
var doc = cur.next();
//change _id of doc to a new value and also do other modifications here
db.YOUR_COLLECTION_NAME.insert(doc);
}
要在shell中运行脚本,请执行以下操作:
mongo localhost:27017/YOUR_DB_NAME dup.js
要理解编写脚本,请阅读:
http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/