如何使用2个不同的值更新数组中的2个特定元素?

时间:2013-08-21 11:38:31

标签: mongodb node-mongodb-native

我有一份文件:

{ _id:ObjectID, list:Array }

该列表包含表单的元素(我将其称为listElement):

{ _id:ObjectID, time:Number }

我想更新2个特定listElements的时间子字段,每个listElements都有自己的不同值。我可以访问listElements的两个_id。

关于这个问题的一个相关的事情:将列表从Array转换为一个对象是谁的键是_id值会更好吗?所以我会做db.update((_id:“Document id”},{“list.423rfasf2q3.time”:200,“list.fjsdhfksjdh2432.time”:100})?

我不确定如何使用ObjectID作为键,但我想我可以将其串起并同时具有_id值,并且包含该listElement的键是相同的字符串。

1 个答案:

答案 0 :(得分:2)

您无法使用两个不同的值更新两个文档,您需要将其作为两个单独的更新运行。

您不希望将数据放入键值中,最好将它们保留原样。没有好的方法来匹配$ exists之外的键值,甚至不支持通配符。因此,您必须获取ObjectId,将其转换为字符串,将其连接到密钥,然后查询该密钥存在的文档。将值放在数组中的文档中要容易得多。此外,没有办法在MongoDB中索引键值,因此如果要索引数据,则需要将其作为数据元素存储在数组中。

编辑以包含位置匹配示例

首先,插入两个文件

> db.test.insert( {list: [ {_id: new ObjectId(), time: 1234}, {_id: new ObjectId(), time: 4556} ] } )
>

证明他们都在那里

> db.test.find()
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [{ "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>

显示如果我们做一个普通的数组过滤器,我们得到数组的所有元素

> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")})
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>

证明我们可以使用$运算符仅返回匹配的第一个数组元素

> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")}, {_id: 0, "list.$": 1})
{ "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 } ] }