我想将所有消息标记为'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()
调用的更新部分。
答案 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都将起作用。