2012-03-13 84 views
7

我有一個人員文檔數據庫。每個人都有一個名爲照片的字段,這是一組照片文檔。我想爲每個照片文檔添加一個新的「已審覈」標誌並將其初始化爲false。向嵌套數組中的所有文檔添加新字段

這是我試圖使用查詢:

db.person.update({ "_id" : { $exists : true } }, {$set : {photos.reviewed : false} }, false, true) 

不過,我得到以下錯誤:

SyntaxError: missing : after property id (shell):1 

這是可能的,如果是這樣,我在做什麼錯在我更新?

這裏是「人」文件的一個完整的例子:

{ 
"_class" : "com.foo.Person", 
"_id" : "2894", 
"name" : "Pixel Spacebag", 
"photos" : [ 
    { 
     "_id" : null, 
     "thumbUrl" : "http://site.com/a_s.jpg", 
     "fullUrl" : "http://site.com/a.jpg" 
    }, 
    { 
     "_id" : null, 
     "thumbUrl" : "http://site.com/b_s.jpg", 
     "fullUrl" : "http://site.com/b.jpg" 
    }] 
} 

獎金因果報應的人誰可以告訴我一個更清潔,爲什麼要更新「所有文件」,而不使用查詢{ "_id" : { $exists : true } }

回答

9

Is this possible, and if so, what am I doing wrong in my update?

不。一般來說,MongoDB只擅長在頂級對象上進行更新。

這裏的例外是$ positional operator。從文檔:Use this to find an array member and then manipulate it

但是,在你的情況下,你想修改數組中的所有成員。所以這不是你需要的。

Bonus karma for anyone who can tell me a cleaner why to update "all documents"

嘗試db.coll.update(query, update, false, true),這將發出「多」更新。最後的true是什麼使它成爲一個多。

Is this possible,

你這裏有兩種選擇:

  1. for環能進行更新。它基本上是一個嵌套的for循環,一個循環遍歷數據,另一個循環遍歷子數組。如果你有很多數據,你會想寫這是你選擇的驅動程序(,可能多線程它)。
  2. 編寫代碼將reviewed作爲空值來處理。寫入數據,如果它遇到與reviewed未定義的照片,則它必須是false。然後,您可以適當地設置字段並將其提交回數據庫。

方法#2是你應該習慣的。隨着數據的增長和添加字段,很難「回溯」所有舊數據。這與在數據庫中包含1B項時發出SQL中的模式更改的問題類似。

取而代之的只是讓您的代碼抵禦null並學會將其視爲默認值。

雖然如此,這仍然不是您尋求的解決方案。

+0

很好的答案。爲了澄清我所尋找的「獎金」是一種用「簡單」查詢來更新所有文檔的方法(比「{」_id「:{$ exists:true}}更簡單」),我理解「多「param,但我仍然需要一個匹配所有文檔的查詢,我想也許」{}「會匹配所有文檔,但我不這麼認爲嗎? – 2012-03-14 03:12:23

+0

不,這不是一個」解決方案「,而是一個爲什麼我根本無法用mongodb(2.0.2)的版本找到我想要的解決方案如果解決方案確實可用,請爲未來的用戶發佈另一個答案 – 2012-03-14 03:18:12

-1

你可以做到這一點

(null, {$set : {"photos.reviewed" : false} }, false, true) 

第一個參數爲空:沒有規定=集合中的任何項目。

「photos.reviewed」應聲明爲字符串來更新子字段。

+2

你不能這樣做,它會失敗'assert failed:need a query' – Warz 2013-06-28 00:43:34

-1

你可以這樣做:

db.person.update({}, $set:{name.surname:null}, false, true); 
-1

老話題了,但是這只是工作罰款蒙戈3.0.6:

db.users.update({ _id: ObjectId("55e8969119cee85d216211fb") }, { $set: {"settings.pieces": "merida"} })

在我的情況下用戶實體看起來像

{ _id: 32, name: "foo", ..., settings: { ..., pieces: "merida", ...} } 
+0

你沒有一個數組,就像在問題中一樣。 – Gramic 2017-01-05 05:47:11

相關問題