2013-03-14 58 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