关于mongodb:Pymongo-获取嵌套集合并更新它

 2021-04-09 

Pymongo - Get a Nested Collection and Updating it

我想在我的MongoDB数据库中找到一个嵌套集合,并从Pymongo更新它。这是我的文档树的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
   "name_list" : [
        {
           "_id" : ...,
           "name" :"Joe Edwards",
           "aliases" : [
               "Allen Dingus",
               "Edward McPickles"
            ]
        },

        ...
    ]
}

我要访问的集合是aliases。当前,我的代码使用find()函数通过" Joe Edwards "的name键在name_list中定位元素。我得到的是一个游标对象;这是预期的。但是,我找不到一种方法来访问aliases集合并对其进行更新(我正在寻找类似db.name_list.find(...)[0].aliases.update(...)的东西,以便可以直接操作aliases)。

我已经查看了PyMongo文档以及Stack Exchange上的很多帖子,但没有发现类似之处。我的临时解决方法是访问name_list并更新属于" Joe Edwards "的整个文档,但这并不是很优雅。有人可以帮忙吗?

谢谢。


MongoDB尝试将驱动程序(包括Pymongo)的运算符与mongo shell的运算符对齐。在最佳情况下,mongo shell操作看起来与该命令的Pymongo版本完全相同。因此,如果找不到所需的操作员,则有可能在操作员文档页面中找到它

关于您的问题,根据您要执行的操作,有几个选项可供您选择:

更新现有的数组元素

这可以使用$更新位置运算符完成:

1
db.name_list.update_one({'aliases':'Allen Dingus'}, {'$set': {'aliases.$': 'Alias 1'}})

请注意aliases.$操作,该操作将更新别名" Allen Dingus"并将其替换为" Alias 1"。对于您的示例文档,这将导致:

1
2
3
4
5
6
7
8
{
 "_id": ...,
 "name":"Joe Edwards",
 "aliases": [
   "Alias 1",
   "Edward McPickles"
  ]
}

添加新的数组元素

这可以使用$push运算符或$addToSet运算符完成:

1
db.test.update_one({'aliases':'Allen Dingus'}, {'$push': {'aliases': 'Alias 2'}})

这将搜索别名" Allen Dingus",并将新条目添加到数组中。对于您的示例文档,这将导致:

1
2
3
4
5
6
7
8
9
{
 "_id": ...,
 "name":"Joe Edwards",
 "aliases": [
   "Allen Dingus",
   "Edward McPickles",
   "Alias 2"
  ]
}