如何将游标的结果插入MongoDB shell中的集合?

时间:2018-04-08 16:42:03

标签: mongodb mongodb-query

很抱歉,如果这是一个基本问题,但我似乎无法找到如何在任何地方执行此操作的示例。我想编写一个shell脚本,从find中构造一个文档,并将结果插入到另一个集合中......如下所示,但以下内容不起作用:

cursor = db.Patients.find({},{"patient_id":1})
while (cursor.hasNext()) {
    db.newCollection.insertOne(cursor.next());
}

当我运行它时,没有任何内容填充到newCollection集合中,但我也没有得到错误。

2 个答案:

答案 0 :(得分:1)

在聚合框架中使用$out运算符。

试试这个mongo查询:

db.Patients.aggregate([
{$project:{"patient_id":1}},
{$out: "NewCollection"}

])

或使用db.eval()

db.eval(function(patient_id){
          var docs = db.Patients.find( { patient_id: patient_id } ).toArray();
          db.NewCollection.insert(docs);
          return docs;
}, 1);

或使用forEach()

db.Patients.find({"patient_id":1}).forEach(
   function(doc){db.Newcollection.insert(doc);}
)

答案 1 :(得分:1)

如果您将cursor声明为变量以保持shell不为您迭代光标,那么您的代码将会起作用:

var cursor = db.Patients.find({},{"patient_id":1})
while (cursor.hasNext()) {
    db.newCollection.insertOne(cursor.next());
}

但您可能还希望为插入的文档分配新的_id值,因此您可以将文档中的原始_id值排除为:

var cursor = db.Patients.find({},{"patient_id":1, _id:0})
while (cursor.hasNext()) {
    db.newCollection.insertOne(cursor.next());
}