我最近开始使用 MongoDB,并且有一个关于更新文档中的数组的问题。
我得到这样的结构:
{
"_id" : ObjectId(),
"post" : "",
"comments" : [
{
"user" : "test",
"avatar" : "/static/avatars/asd.jpg",
"text" : "....."
}
{
"user" : "test",
"avatar" : "/static/avatars/asd.jpg",
"text" : "....."
}
{
"user" : "test",
"avatar" : "/static/avatars/asd.jpg",
"text" : "....."
}
...
]
}
我正在尝试执行以下查询:
update({"comments.user":"test"},{$set:{"comments.$.avatar": "new_avatar.jpg"}},false,true)
问题是它更新所有文档,但它只更新每个文档中的第一个数组元素。有什么方法可以更新所有数组元素,或者我应该尝试手动执行此操作?
谢谢。
您无法在单个更新操作中修改多个数组元素。因此,您必须重复更新才能迁移需要修改多个数组元素的文档。您可以通过迭代集合中的每个文档,重复应用更新来完成此操作$elemMatch
直到该文档的所有相关注释被替换,例如:
db.collection.find().forEach( function(doc) {
do {
db.collection.update({_id: doc._id,
comments:{$elemMatch:{user:"test",
avatar:{$ne:"new_avatar.jpg"}}}},
{$set:{"comments.$.avatar":"new_avatar.jpg"}});
} while (db.getPrevError().n != 0);
})
请注意,如果您的应用程序需要此操作的效率,则您应该规范化架构,以便将用户头像的位置存储在单个文档中,而不是存储在每个注释中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)