2014-02-18 50 views
1

我在我的文件有「國家」的數組:檢查數組第一個值,插入新的有條件

{ 
    "_id: ObjectId("53026de61e30e2525d000004") 
"states" : [ 
    { 
     "name" : "complete", 
     "userId" : ObjectId("52f4576126cd0cbe2f000005"), 
     "_id" : ObjectId("53026e16c054fc575d000004") 
    }, 
    { 
     "name" : "active", 
     "userId" : ObjectId("52f4576126cd0cbe2f000005"), 
     "_id" : ObjectId("53026de61e30e2525d000004") 
    } 
] 
    } 

我只是插入一個新的狀態到陣列的前面,當有一個新的狀態。目前的工作,直到mongo 2.6發佈在這裏:Can you have mongo $push prepend instead of append?

但是我不希望用戶能夠在行中保存兩次相同的狀態。 I.E.如果它已經完成,你不應該添加另一個'完整'狀態。有沒有一種方法可以檢查數組中的第一個元素,並且只有在一個查詢/更新命令與mongo不相同時才插入新狀態。

我說一個查詢/更新,因爲mongo不支持事務,所以我不想查詢數組中的第一個元素,然後發送另一個更新語句,因爲如果另一個狀態得到插入我的查詢和我的更新之間。

回答

1

您可以查詢資格的update statement,例如:

db.mydb.states.update({"states.name":{$nin:["newstate"]}},{$addToSet:{"states":{"name":"newstate"}}}) 

這將阻止用戶升級,如果update沒有返回文檔的query一部分。您還可以在query零件上額外添加更多字段進行過濾。

相關問題