我在收藏中有这个结构。如果“语言”为“英语”,我想将“备注”更新为“更好”。
{"Information":[{"id":"5245","details":[{"language":"english","remark":"good","status":"published"},{"language":"hindi","remark":"good","status":"published"},{"language":"arabic","remark":"good","status":"published"}]}],"name":"saroj","company":"visa"}
我能够根据语言从db获取数据的特定部分
db.getCollection("containts").aggregate([
// Filter possible documents
{ "$match": {"$and": [{ "Information.id": "1" },{ "name": "saroj" }]}},
// Unwind the array to denormalize
{ "$unwind": "Information" },
{ "$unwind": "Information.details" },
// Match specific array elements
{ "$match": { "Information.detail.language": "english" } },
// Group back to array form
{ "$group": {
"_id": "$_id",
"details": { "$push": "Information.details" }
}}])
输出:
{ "details": [{
"language": "english",
"remark": "good",
"status": "published"
}]}
但是我无法根据“语言”更新“备注”
答案 0 :(得分:0)
如果您使用的是 mongodb 3.6 及更高版本,则可以使用arrayFilters
来更新数组中的元素。
我使用了与您在上面的问题中提到的数组相同的数组,并测试了以下查询,该查询返回更新的文档。
db.collectionName.findOneAndUpdate(
{ "Information.id": "5245", "name": "saroj"},
{ $set : {"Information.$[outer].details.$[elem].remark" : "better"}},
{
returnNewDocument : true,
arrayFilters: [{"elem.language": "english"},{ "outer.id": "5245"}]
}
)
您可以获得有关arrayFilters
here的详细说明。
要获得更新的文档,请以猫鼬为例,您可以使用{new : true}
代替returnNewDocument: true
(在mongodb shell中使用)。