2016-03-15 52 views
0

我希望能在一次操作中完成此操作,只需要敲擊數據庫一次......但我不知道是否可以使用api。 ....設置字段如果不存在,推送到數組,然後返回文檔

我想要的是:

  1. 找到ID文件(這將永遠存在)
  2. 添加對象,如果它不存在{ dayOfYear: 3, dataStuff: [{time: Date(arg), data: 123] }
  3. {time: Date(arg), data: 123] }dataStuff array
  4. 返回修改後的文檔

我熟了沿着

return this.collection.findOneAndUpdate(dataDoc, 
    { $set: { dayOfYear: reqBody.dayOfYear , 
     $addToSet: { dataStuff: { time: Date(reqBody.date), data: reqBody.data } 
    } 

線的東西,但沒有成功

+0

這不僅僅是一個你不清楚的問題。語句中存在語法錯誤,也應該從以前的問題中吸取教訓。我不知道你是否要求一種不同的方法來處理你以前的問題響應[$ addToSet基於對象關鍵字存在](http://stackoverflow.com/a/35762783/5031275)。如果這是你再次提出的問題,那麼這就是爲什麼這不是一次更新的原因,這些原因都應該得到很好的解釋。 –

+0

你能給一些反饋嗎?自發布以來,您顯然已經訪問過該網站,它只能幫助您清楚地明確自己在問什麼。 –

+0

隨着MongoDb apis的推出,我無法正確地繼續使用我的設計,因爲會在嵌入式文檔中進行遞歸。我將不得不將其分解爲多個文檔並使用規範化。由於規範化,我將看看PostgreSQL,因爲它是專用的關係數據庫。 MongoDb是我選擇非規範化的選擇,但不適用於規範化。 – dman

回答

2

更新對象需要爲每個原子操作「獨立」頂層鍵:

return this.collection.findOneAndUpdate(
    dataDoc, 
    { 
     "$set": { dayOfYear: reqBody.dayOfYear }, 
     "$addToSet": { 
      "dataStuff": { "time": Date(reqBody.date), "data": reqBody.data } 
     } 
    }, 
    { "returnOriginal": false } 
) 

使用核心API中的.findOneAndUpdate(),您還需要將"returnOrginal"選項設置爲false以便返回修改後的文檔。使用mongoose API代替{ "new": true }

在這種語法中,兩個調用都返回一個「Promise」來解決,而不僅僅是一個直接的響應。

1

如果要檢查整個對象存在,你就必須這樣比較所有屬性,如

this.collections.update({ 
    _id: dataDoc, 
    dayOfYear: { 
    $ne: reqBody.dayOfYear 
    }, 
    dataStuff: { 
    $elemMatch: { 
     time: { 
     $ne: Date(arg) 
     }, 
     data: { 
     $ne: reqBody.data 
     } 
    } 
    } 
}, { 
    $set: { 
    dayOfYear: reqBody.dayOfYear, 
    }, 
    $addToSet: { 
    dataStuff: { 
     time: Date(arg), 
     data: reqBody.data 
    } 
    } 
}); 

,可以確保您隨時更新一個或零藏品。第一個參數是不返回元素或單個元素的查詢(因爲_id存在),並且如果它返回一個元素,它將被更新。我相信這就是你所需要的。

相關問題