我想把所有的信息都标为“吉姆”读的。以下是线程的结构:
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/