2014-11-21 16 views
3

我有以下文件相應的查詢字段應用位置操作:不能沒有包含數組

{ "id" : "1", 
"name": "Paul", 
"a": { "b" : [{"name" : "laura", "lastname" : "Palmer"}]} 
} 

現在我想更新在B每姓氏。

我嘗試這樣做:

db.organizations.update({"name" : "Paul", "a.b" : {$exists: true}}, 
{ "$set" : {"a.b.$.lastname" : "no_lastname"}}); 

,但我得到:沒有包含數組的相應查詢字段 無法應用的位置操作。

有人有一個想法我應該做什麼?

+0

它已經討論了堆棧溢出很多很多次,你就可以用$運算更新一個項目,你不能更新所有數組的條目 – Disposer 2014-11-21 15:43:34

+0

那麼我應該怎麼做呢? – user1345883 2014-11-21 15:52:16

+0

從概念上講,您得到的錯誤是因爲'query'參數必須包含您在'projection'參數中使用位置運算符'$'的字段。如果你的查詢包含'「a.b.lastname」:{$ exists:true}',你不會得到這個錯誤,但無論如何,只有'b'中匹配查詢的第一個子文檔纔會被更新。 – BatScream 2014-11-21 19:27:06

回答

2

您可以在蒙戈外殼採用cursor.forEach()光標的方法來實現這一目標:

db.organizations.find({"name" : "Paul", "a.b" : {$exists: true}}).forEach(function(doc) { 
    array = doc.a.b; 
    array.forEach(function(elem) { 
     elem.lastname="no_lastname" 
    }); 
    db.organizations.update({_id:doc._id}, {$set:{"a.b":array}}); 
}) 
+0

在1條語句中沒有辦法做到這一點嗎? – user1345883 2014-11-24 07:59:06

+0

不,還沒有......至今。 – 2014-11-24 13:08:32