2

我想将所有消息标记为“吉姆”已读。这是一个线程的结构:

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 失败:“无法使用字符串字段名称 [$] 附加到数组”

该查询适用于 a所以我猜问题出在调用db.threads.find()的更新部分。findAndModify()

4

2 回答 2

2

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

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 的更新就可以了。无论该字段是否存在,使用 $each 都将起作用。

于 2013-11-11T07:44:18.607 回答
1

通过一次操作,您还不能做到这一点。看到这个问题,这和你的一样。

您将不得不在您的应用程序中进行此类操作:find()jim 尚未阅读的所有消息,将他附加到它们,然后将messages线程的字段设置为该数组。

于 2013-03-14T12:17:14.500 回答