2016-05-16 45 views
2

Node.JS,MONGODB,不使用貓鼬MongoDB Upserts變量名稱作爲密鑰(Node.JS)

我有一個文件,我正在保存。當我使用UPSERT,其結構中的數據像這樣:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), 
     "document" : 
       [ {"name" : "SomeName" } ] 
} 

當我使用插入插入它所有的根目錄下:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), "name" : "SomeName" } 

這顯然會導致大量的不一致。我嘗試了各種各樣的東西。我已經嘗試了各種方法,如findOneAndReplace,使用Upsert更新,我試過替換$ setOnInsert。當Upsert似乎參與其中時,這一切都會發生同樣的事情。

我曾嘗試使用文件[0]來訪問所述陣列的第一塊,但將引發一個錯誤...「意外的標記[」

我已經通過嘗試了各種方法和挖小時各種文件,並且對其他人有這樣的問題進行了高低調查,但對於其他人來說似乎沒有很好的文件記錄。

任何人都有任何建議,以確保所有的字段都在根級別,而不是嵌套在變量名下?下面的相關代碼。

findReplace: function(db, document, collection) { 

    var dbCollection = db.collection(collection); 

    var filter = document.name; 

    return new Promise(function(resolve, reject) { 
     dbCollection.updateOne({ 
      "name" : filter 
     }, { 
      document 
     }, { 
      upsert: true 
     }, function(err, result) { 
      if (err) { 
       console.log('error', err) 
       reject(err); 
      } 
      console.log("Found Document and Upserted replacement Document"); 
      resolve([{'status' : 'success'}]); 
     }); 
    }); 
} 

回答

1

當你這樣做:

{ 
    document 
} 

您正在創建包含document屬性和變量的值作爲其值的對象:

{ 
    document: [ {"name" : "SomeName" } ] 
} 

This is new functionality from ES6。如果要訪問文檔變量的第一項,請勿創建新對象:

return new Promise(function(resolve, reject) { 
    dbCollection.updateOne({ 
     "name" : filter 
    }, document[0], { // <======== 
     upsert: true 
    }, function(err, result) { 
     if (err) { 
      console.log('error', err) 
      reject(err); 
     } 
     console.log("Found Document and Upserted replacement Document"); 
     resolve([{'status' : 'success'}]); 
    }); 
}); 
+0

完美,謝謝!我一直在努力跟上ES6的變化,但總是有新的東西。它總是小事。 – FouMedia