2013-03-14 61 views
2

我想將所有消息標記爲由'jim'讀取。這裏是一個線程的結構:

db.threads.save({ 
    messages: [ 
     { 
      read_by: ['bob', 'jim'] 
     }, 
     { 
      read_by: ['bob'] 
     }, 
     { 
      read_by: ['bob'] 
     } 
    ] 
}) 

正如你所看到的,一個消息已經被「吉姆」,剩下的只有通過「鮑勃」讀。我想找到並修改任何嵌入式文檔,以便'012'附加到read_by陣列。

這裏就是我的了:

db.threads.findAndModify({ 
    query: { 
     'messages.read_by': { 
      $ne: 'jim' 
     } 
    }, 
    update: { 
     $push: { 
      'messages.$.read_by': 'jim' 
     } 
    } 
}) 

我得到這個錯誤:

uncaught exception: findAndModifyFailed failed: "can't append to array using string field name [$]"

的查詢工作與db.threads.find(),所以我想這個問題是與findAndModify()呼叫的更新部分。

+0

試試這個,...... 更新:{$ 推:{ 'messages.read_by': '吉姆' } } ...作爲read_by數組中的元素,你可以直接訪問它。 – axierjhtjz 2013-03-14 11:39:49

+0

是的,這不起作用。看起來你無法$ push到嵌入式文檔數組。 – DrPheltRight 2013-03-14 12:20:53

回答

1

我知道它已經有一段時間了,但是推入嵌套文檔確實是可能的。你需要在其中添加一個。例如,

db.threads.update({ 
    'messages.read_by': { 
     $ne: 'jim' 
    } 
}, 
{ 
    $push: { 
     'messages.read_by': { 
      $each: ['jim'] 
     } 
    } 
} 
) 

在這裏看到更多的樣本 - http://docs.mongodb.org/manual/reference/operator/update/push/

即使你只是過客只有一個值,爲嵌套數組,你需要通過每個$。如果文檔已經包含一個包含一些值的read_by字段,那麼沒有這兩個字段的更新將工作。無論該字段是否存在,使用$都是可行的。

1

通過一個操作,你還不能這樣做。請參閱this question,與您的相同。

您將不得不在您的應用程序中執行以下操作:find() jim尚未讀取的所有消息,將其附加到它們,然後將線程的messages字段設置爲該數組。

+2

該死的男人,這吸吮:( – DrPheltRight 2013-03-14 12:29:28