在MongoDB集合中通过它的idsearch数组条目

这可能吗:

我想更新项目中的“用户故事”之一,项目中可以有许多项目和许多用户故事。 我想通过它的IDselect项目,然后根据它的id在该项目中的用户故事,并更新其字段。

问题:我可以使用什么MongoDB查询?

MongoDB数据库剪切

{ "_id": ObjectId("4ecee95d6ce4004424000001"), //Project ID "owner": "test2", "stories": [ { "_id": "75vUURHfE1bN9vkbwC2kR85s", //User story Id "title": "ok", "deadline": "10\/10\/2011", "description": "ok", "sp": "5", "value": "5", "roi": "1.00", "type": "story", "lane": 0 }, { "_id": "nTsa8x6vFJvdXfFtEHbcFIyl", "title": "test", "deadline": "10\/10\/2011", "description": "test", "sp": "5", "value": "5", "roi": "1.00", "type": "story", "lane": 0 }, { "_id": "i8Nd3HOhz7hZFzzInfCcapCe", "title": "test #2", "deadline": "10\/10\/2011", "description": "test #2", "sp": "5", "value": "5", "roi": "1.00", "type": "story", "lane": 0 } ], "team": [ ], "title": "ok" } 

我目前正在使用socket.io,并在套接字事件我检索以下数据:

JSON

  var story = { _id: data.id, title: data.title, deadline: data.deadline, description: data.description, sp: data.sp, value: data.value, roi: data.roi, type: data.type } 

我想用上面的JSON对象来更新mongo数据库中“故事”中的故事。

原则上,您可以使用$运算符( 位置运算符 )来执行此操作:

 db.coll.update( {"stories._id":"i8Nd3HOhz7hZFzzInfCcapCe"}, {$set:{"stories.$.roi":"1.25"}}, false, true ) 

不过,我相信_id是一个保留的名字, 也许你不应该使用_idembedded对象 – 我在使用MongoDB 2.0.1rc-1的shell中遇到了这个问题,所以你可能想尝试一下。 像这样:

 db.coll.update( {"stories.id":"i8Nd3HOhz7hZFzzInfCcapCe"}, {$set:{"stories.$.roi":"1.25"}}, false, true ) 

有一些注意事项$运算符只适用于第一个匹配的项目,它不能用于upserts。

作为一个侧面说明,从你给的信息我有这样的感觉,最好不embedded用户故事,并使用一个单独的集合。

一个原因是如果使用embedded式集合(即,如果许多人一次编辑同一个项目,则需要以某种方式合并数组或使用locking机制),并发会变得非常痛苦。