检查数组中的第一个值,有条件地插入新值

时间:2014-02-18 17:35:54

标签: arrays mongodb

我的文件中有一系列“状态”:

    {
    "_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 个答案:

答案 0 :(得分:1)

您可以使用查询来限定update statement,例如:

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

如果query的{​​{1}}部分未返回任何文档,则会阻止用户进行更新。您还可以在update部分添加更多字段以进行过滤。