使用ruby将值附加到mongodb中的子集合中的数组?

时间:2014-09-24 09:38:17

标签: ruby mongodb mongodb-query

我的文档结构如下

{
   _id: 32131

   names:
   {
      current : {value : 1, name: a} 
      prev : [{value : 2, name: b}, {value : 3, name: c} , {value : 4, name: d} ]
   }


}

当我收到需要在names字段中插入的新记录时,我想在current字段中获取记录并将其推送到prev数组。然后我想将新记录插入current字段。新记录将始终具有唯一的value

例如,如果我将新记录设为{value: 5, name : e},我希望上述文档如下所示

   {
       _id: 32131
       names:
       {
          current : {value : 5, name: e} 
          prev : [{value : 2, name: b}, {value : 3, name: c} , {value : 4, name: d}, {value : 1, name: a}]
       }

    }

1 个答案:

答案 0 :(得分:1)

你在这里基本上要做的并不是不合理的,但当然有一个明显的问题。问题是目前MongoDB无法引用其他字段中存在的现有值,并将它们用作更新的一部分。

所以你想要的基本JavaScript shell形式的伪代码是:

db.collection.update(
    { "_id": 32131 },
    { 
        "$set": { "names.current": { "value": 5, "name": "e" } },
        "$push": { "names.prev": { 
            "value": this.names.current.value, 
            "name": this.names.current.name
        }}
    }
)

但当然这不存在也不起作用。

我建议的是“将问题转过来”,基本上将当前值存储在数组中:

{
   "_id": 32131,
   "names": {
      "current" : { "value": 1, "name": "a" } 
      "revisions": [
          { "value": 2, "name": "b" }, 
          { "value": 3, "name": "c" }, 
          { "value": 4, "name": "d" },
          { "value": 1, "name": "a" } 
      ]
   }
}

因此,当阵列中已存在“当前”值时,更改数据并添加“当前”非常简单:

db.collection.update(
    { "_id": 32131 },
    { 
        "$set": { "names.current": { "value": 5, "name": "e" } },
        "$push": { "names.revisions": { 
            "value": 5,
            "name": "e"
        }}
    }
)

当您在客户端或服务器上以某种形式的逻辑查询时,您始终可以“过滤”数组中的“当前”值。

但这就是我认为最好的方法,否则你需要在“写”之前“读取”数据才能知道存在的数据。这将导致并发问题。