这可能吗:
我想更新项目中的一个“用户故事”,项目中可能有许多项目和许多用户故事。我想通过它的id选择项目,然后根据其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,在socket事件中我检索以下数据:
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数据库的'stories'中更新故事。
答案 0 :(得分:3)
原则上,您可以使用$
运算符(positional operator)来执行此操作:
db.coll.update( {"stories._id":"i8Nd3HOhz7hZFzzInfCcapCe"},
{$set:{"stories.$.roi":"1.25"}}, false, true )
但是,我认为_id
是保留名称;也许你不应该使用_id
来嵌入对象 - 我在使用MongoDB 2.0.1rc-1的shell中遇到了这个问题,所以你可能想尝试一下。喜欢这样:
db.coll.update( {"stories.id":"i8Nd3HOhz7hZFzzInfCcapCe"},
{$set:{"stories.$.roi":"1.25"}}, false, true )
有一些警告:$
运算符仅适用于第一个匹配的项目,并且不能与upserts一起使用。
作为附注,根据您提供的信息,我感觉不嵌入用户故事并使用单独的集合更好。
一个原因是,如果使用嵌入式集合(即,如果许多人在某种程度上需要以某种方式合并数组或使用锁定机制来编辑同一项目),并发性将变得很痛苦。