$ push in embedded document array

时间:2013-03-14 11:23:20

标签: mongodb

我想将所有消息标记为'jim'。这是一个线程的结构:

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

正如你所看到的,'jim'已经读过一条消息,其余的消息只有'bob'。我想查找并修改任何嵌入的文档,以便'jim'附加到read_by数组。

这是我得到的地方:

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

我收到此错误:

  

未捕获的异常:findAndModifyFailed失败:“无法使用字符串字段名称附加到数组[$]”

该查询适用于db.threads.find(),因此我猜问题是findAndModify()调用的更新部分。

2 个答案:

答案 0 :(得分:1)

通过一次操作,您还不能这样做。请参阅this question,这与您的相同。

您的应用程序中必须进行此类操作:find()所有jim尚未读取的消息,将其追加给他们,然后将线程的messages字段设置为此数组

答案 1 :(得分:1)

我知道它已经有一段时间了,但是推入嵌套文档确实是可能的。您需要在其中添加每个。例如,

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

请点击此处查看更多样本 - http://docs.mongodb.org/manual/reference/operator/update/push/

即使您只传递一个值,但对于嵌套数组,您需要传递$ each。如果文档已经包含read_by字段,其中包含一些值,那么没有每个值的更新都有效。无论字段是否存在,使用$ each都将起作用。