2011-11-25 97 views
2

通過其ID的數組項這是可能的:搜索在MongoDB中收集

我想更新項目中的「用戶故事」中的一個,可以有很多項目,很多用戶故事在一個項目中。我想通過它的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,並在插座事件檢索到以下數據:

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 
    } 

我想更新mongo數據庫中「故事」內的故事e使用上面的JSON對象。

回答

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使用。

作爲一個方面說明,從你給的信息我有這樣的感覺,沒有嵌入用戶故事,並使用一個單獨的集合,而不是更好。

其中一個原因是,如果使用嵌入式集合(即,如果許多人一次編輯同一項目,需要以某種方式合併數組或使用鎖定機制),併發將變得非常痛苦。

+0

感謝這似乎與_id工作。我使用_id是因爲它允許我將自己的id代替mongodb生成的id。否則我會有這樣的:_id:ObjectId(「4ecee95d6ce4004424000001」),id:i8Nd3HOhz7hZFzzInfCcapCe。 – Jack

+1

他指的是爲了清晰起見而不應該有_id字段的嵌入式文檔。 –

+0

還沒有認真嘗試過,但我認爲嵌入_id字段沒問題。像Mongoid這樣的庫甚至可以自動創建這些庫。 – Thilo