Pymongo - 获取嵌套集合并更新它

时间:2016-09-14 00:59:35

标签: mongodb pymongo

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

{
    "name_list" : [
        {
            "_id" : ...,
            "name" : "Joe Edwards",
            "aliases" : [
                "Allen Dingus",
                "Edward McPickles"
            ]
        },

        ...
    ]
}

我想访问的集合是aliases。目前,我的代码使用find()函数在name_list中使用“Joe Edwards”的name键找到元素。我得到的是一个游标对象;这是预期的。但是,我无法找到访问aliases集合并更新它的方法(我正在寻找类似db.name_list.find(...)[0].aliases.update(...)的内容,以便我可以直接操作aliases

我已经查看了PyMongo文档和Stack Exchange上的很多帖子,但我发现没有类似的东西。我的临时修复只是访问name_list并更新属于“Joe Edwards”的整个文档,但它并不是很优雅。有人可以帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:0)

MongoDB尝试将驱动程序的运算符(包括Pymongo)与mongo shell的运算符对齐。在最好的情况下,mongo shell操作看起来与命令的Pymongo版本完全相同。因此,如果您找不到您需要的运营商,您可能会在Operator documentation page

中找到它。

关于您的问题,根据您的目的,您可以选择以下几种方式:

更新现有数组元素

可以使用$ update positional operator

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

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

{
  "_id": ...,
  "name": "Joe Edwards",
  "aliases": [
    "Alias 1",
    "Edward McPickles"
  ]
}

添加新数组元素

可以使用$push operator$addToSet operator

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

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

{
  "_id": ...,
  "name": "Joe Edwards",
  "aliases": [
    "Allen Dingus",
    "Edward McPickles",
    "Alias 2"
  ]
}