首页 > 解决方案 > 向 MongoDB pymongo 中的特定集合元素添加新字段

问题描述

我正在尝试通过向其中添加新字段来更新现有数组元素。

...
{
   "_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
   "firstName": "foo",
   "result": [
      { 
         "_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
         "subjectName":"Mathematics",
         "marks": 60
      },
      { 
         "_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
         "subjectName":"Science",
         "marks": 70
      },
      { 
         "_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
         "subjectName":"Social science",
         "marks": 50
      }
   ]
},
...

现在我想在名为“isFavorite: true”的科学科目中添加新领域

喜欢,

{
   "_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
   "firstName": "foo",
   "result": [
      { 
         "_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
         "subjectName":"Mathematics",
         "marks": 60
      },
      { 
         "_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
         "subjectName":"Science",
         "marks": 70
         "isFavorite": true   #-----------------New field----------
      },
      { 
         "_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
         "subjectName":"Social science",
         "marks": 50
      }
   ]
},
...

到目前为止我尝试了什么?

from pymongo import MongoClient
...

collection = mongoInstance["student"]
student = collection.find_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"})

for result in student["result"]:
    if result["_id"] == "0591d9a0-fd0f-4876-9bd3-dec4d5ab452e":
         result["isFavorite"] = True
         break

collection.update_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"}, {"$set": student })

这是可行的,但我相信可能有一种简单的方法可以通过它的 id 查找学生文档,并按 item._id 将新字段添加到数组中。

寻找一些优雅的 Mongodb 查询来查找和更新特定的数组元素。

标签: python-3.xmongodbaggregation-frameworkpymongo

解决方案


@Alex Blex 在位置运算符方面是正确的;pymongo 语法非常相似:

db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
                            'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
                           {'$set': {'result.$.isFavorite': True}})

使用提供的示例数据的完整示例:

from pymongo import MongoClient
import pprint

db = MongoClient()['mydatabase']

db.mycollection.insert_one({
    '_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
    'firstName': 'foo',
    'result': [
        {
            '_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
            'subjectName': 'Mathematics',
            'marks': 60
        },
        {
            '_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
            'subjectName': 'Science',
            'marks': 70
        },
        {
            '_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
            'subjectName': 'Social science',
            'marks': 50
        }
    ]
})

db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
                            'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
                           {'$set': {'result.$.isFavorite': True}})

pprint.pprint(list(db.mycollection.find())[0])

结果:

{'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
 'firstName': 'foo',
 'result': [{'_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
             'marks': 60,
             'subjectName': 'Mathematics'},
            {'_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
             'isFavorite': True,
             'marks': 70,
             'subjectName': 'Science'},
            {'_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
             'marks': 50,
             'subjectName': 'Social science'}]}

推荐阅读