我想把所有的信息都标为“吉姆”读的。以下是线程的结构:

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

如你所见,一条信息已经被“吉姆”读过了,其余的只有“鲍勃”。我想查找并修改任何嵌入的文档,以便将“jim”附加到read_by数组中。
这是我得到的:
db.threads.findAndModify({
    query: {
        'messages.read_by': {
            $ne: 'jim'
        }
    },
    update: {
        $push: {
            'messages.$.read_by': 'jim'
        }
    }
})

我得到这个错误:
未捕获异常:FindAndModifyFailed失败:“无法使用字符串字段名[$]追加到数组”
查询使用db.threads.find()所以我猜问题出在findAndModify()调用的更新部分。

最佳答案

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

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都可以工作。

关于mongodb - $ push in embedded document array,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15407851/

10-15 23:58