【问题标题】:Pymongo - Get a Nested Collection and Updating itPymongo - 获取嵌套集合并更新它
【发布时间】:2016-09-21 14:13:52
【问题描述】:

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

{
    "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”的整个文档,但这并不是很优雅。有人可以帮忙吗?

谢谢。

【问题讨论】:

  • name_list 每个文档中的字段以及您要查询的集合的名称吗?
  • 不,它是我数据库中最高级别的集合。

标签: mongodb pymongo


【解决方案1】:

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"
  ]
}

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2021-07-04
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多