2013-04-05 142 views
1

蒙戈內嵌套數組更新具體數值我有幾分以下模式(無_id) -通過貓鼬

{uid: String, 
inbox:[{msgid:String, someval:String}] 
} 

現在,在請求我得到的MsgId和我用它在下面貓鼬查詢像這個 -

my_model.findOne({'inbox.msgid':'msgidvaluexyz'} 
    , function(err, doc) {   
    console.log(doc); 
    return !0; }) 

現在的問題是,我得到整個文件,其中有具體的消息收件箱中的其他消息一起 -

Output- 
    {uid:'xyz', 
    inbox:[ 
    {msgid:,someval}, 
    {msgid:'our queried msgid',someval}, //required sub array 
    {msgid:,someval}, 
     ] 
     } 

現在我可以使用什麼查詢來獲取特定的子數組,因爲文檔收件箱太大而無法循環。

回答

2

使用$ positional selection operator有返回的文檔僅包括匹配inbox元素:

my_model.findOne({'inbox.msgid':'msgidvaluexyz'} 
    , {'inbox.$': 1} 
    , function(err, doc) {   
    console.log(doc); 
    return !0; }) 
+0

thx man..sure看起來好像會得到完成的工作..將節省一些嚴重的處理時間.. :) – digster 2013-04-06 09:13:51

+0

一個快速問題...回調確實返回特定的子數組... ..但是當我嘗試更改某些內容並保存回調變量時......說callback_doc.inbox [0] .changed_var = something; callback_doc.save()..它更新對第一個索引陣列(索引0)..我們如何引用回調中的特定索引..就像callback_doc.inbox [$]? – digster 2013-04-09 11:28:15

+0

@ user597272你沒有整個對象,所以我想你會想通過'update'而不是'save'來更新它,並且使用'$'位置更新操作符,它在更新方面起到相同的作用。 – JohnnyHK 2013-04-09 11:40:01

0

如果我理解正確你的問題:

// find each person with a last name matching 'Ghost' 
var query = Person.findOne({ 'name.last': 'Ghost' }); 

// selecting the `name` and `occupation` fields 
query.select('name occupation'); 

http://mongoosejs.com/docs/queries.html

您可以選擇您想回到哪個領域。你只能得到inbox數組或除此之外的所有數據。

+0

srry..but我想你沒有得到我的問題妥善......「收件箱」字段是一個數組,它仍然會有所有味精的子陣列.. – digster 2013-04-05 10:25:47