【问题标题】:Check first value in array, insert new conditionally检查数组中的第一个值,有条件地插入新值
【发布时间】:2014-02-19 03:10:30
【问题描述】:

我的文档中有一组“状态”:

    {
    "_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?

但是我不希望用户能够连续两次保存相同的状态。 IE。如果它已经完成,您应该无法添加另一个“完成”状态。有没有一种方法可以检查数组中的第一个元素,如果它在一个查询/更新命令中与 mongo 不同,则仅插入新状态。

我说一个查询/更新是因为 mongo 不支持事务所以我不想查询数组中的第一个元素然后发送另一个更新语句,因为如果插入另一个状态可能会导致问题在我的查询和我的更新之间。

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    您可以通过查询来限定您的update statement,例如:

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

    如果updatequery 部分未返回任何文档,这将阻止用户更新。您还可以在 query 部分添加更多字段以进行过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-31
      • 2021-09-07
      • 1970-01-01
      • 2019-06-11
      • 2019-03-31
      • 2018-11-30
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多