2016-01-29 148 views
0
Collection.find({ $and: [ {title: { $exists: true}}, {reference: { $exists: true }} ]}).pretty() 

這給我與結構的一些文件:的MongoDB:移動領域的新文件和更新領域和陣列

{ 
    "_id" : "EJBFtZ7EeGbBPwJaw", 
    "title" : "title", 
    "reference" : "8uujF9pivpGA37oQc", 
    "parent" : "v7DJzq859XX4kvKPi", 
    "ancestors" : [ 
     "v7DJzq859XX4kvKPi" 
    ] 
} 

現在我要改變所有文件的方式:

  1. 將標題移至新文檔並
  2. parent id更新爲新文檔
  3. 推新標識的祖先(在第一位置!)

結果應該是:

{ 
    "_id" : "gzRn4nDKfeewb8EYE", // new document 
    "title" : "title",    // moved title 
    "parent" : "v7DJzq859XX4kvKPi", 
    "ancestors" : [ 
     "v7DJzq859XX4kvKPi" 
    ] 
}, 
{ 
    "_id" : "EJBFtZ7EeGbBPwJaw", // removed title 
    "reference" : "8uujF9pivpGA37oQc", 
    "parent" : "gzRn4nDKfeewb8EYE", // update parent id to new id 
    "ancestors" : [ 
     "gzRn4nDKfeewb8EYE",  // add new id at first pos 
     "v7DJzq859XX4kvKPi" 
    ] 
} 

所以我在想什麼的是類似的東西:

Collection.find({ $and: [ {title: { $exists: true}}, {reference: { $exists: true }} ]}).forEach(function(doc) { 
    // get data from source 
    var id  = doc.id; 
    var title = doc.title; 
    var parent = doc.parent; 

    // insert new document 
    var newId = Collection.insert({ 
     title: title, 
     parent: parent, 
     ancestors: [parent] 
    }); 

    // update source document 
    if (newId) { 
     Collection.update(
      { _id: id }, 
      { 
       $set: { parent: newId }, // update parent id 
       $push: { ancestors: newId } // update ancestors array 
       $unset: { title: '' }  // remove title 
      } 
     );  
    } 

}); 
  1. 但是,執行$push將追加該ID,而不是預先添加它。
  2. 使用if (newId) {}或使用insert的回調函數是否正確?

如果有任何改進可能,請讓我知道。

+0

則應指定 「0 $位置」:-https://docs.mongodb.org/v2.6/reference/operator/update/position/ –

+0

待辦事項如果我使用'$ position',我必須使用'$ each',儘管只有一個元素是我想要推送的。 – user3142695

+0

是的,你需要使用每個嘗試使用$推:{ancestors:{$ each:[newId],$ position:0} –

回答