在子文档中为特定规则

时间:2017-11-23 04:05:54

标签: mongodb pymongo

如何更新文档并在特定规则的子文档中插入键值?

  

MongoDB版本:3.4

使用此CLI插入模拟数据

db.country.insertMany([{"_id":"us","groups":[{"group":"1"},{"group":"2"} ]},{"_id":"eu","groups":[{"group":"1"},{"group":"2"}]}, {"_id":"jp","groups":[{"group":"2"}]}])

原始数据

db.country.find()

{
    "_id": "us", "groups": [ { "group" : "1" }, { "group": "2" } ]
}
{
    "_id": "eu", "groups": [ { "group" : "1" }, { "group" : "2" } ]
}
{
    "_id": "jp", "groups": [ { "group" : "2" } ]
}

如何获得此结果? (只需添加状态:对组1感到高兴)

{
    "_id": "us", "groups": [ { "group" : "1",  "status": "happy" }, { "group": "2" } ]
}
{
    "_id": "eu", "groups": [ { "group" : "1", "status": "happy" }, { "group" : "2" } ]
}
{
    "_id": "jp", "groups": [ { "group" : "2" } ]
}

我知道如何选择匹配group = 1的所有组

db.country.aggregate([ 
    {'$unwind': '$groups'},  
    {'$match': {'groups.group': '1'}} , 
    {'$project': {'group': '$groups.group', _id:0 }}  
])

{ "group" : "1" }
{ "group" : "1" }

并且也知道如何使用update + $set这样的

// { "_id": 1, "people": {"name": "tony" } }
db.test.update({_id: 1}, { $set: {'people.country': 'taiwan'}})
// { "_id": 1, "people": {"name": "tony" , "country": "taiwan" } }

但如何合并update + $setaggregate function?请帮帮我。

pymongo对我来说没问题。

1 个答案:

答案 0 :(得分:1)

  

如何获得此结果? (只需添加状态:对组1感到高兴)

使用$来引用匹配的子文档在数组中的位置。

db.coll.update_many({'groups.group':'1'}, {'$set': {'groups.$.status': 'happy'}})

查看更多here