当前位置: 首页 > 知识库问答 >
问题:

获取一个嵌套的集合并更新它

岳曦
2023-03-14

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

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

        ...
    ]
}

我希望访问的集合是aliase。目前,我的代码使用find()函数来定位name_list中的元素,name键为“Joe Edwards”。我得到的回报是一个光标对象;这是意料之中的。但是,我找不到访问aliase集合并更新它的方法(我正在寻找类似db.name_list.find(…)[0]。aliases.update(…)这样我就可以直接操作aliase)。

我已经查看了PyMongo文档和堆栈交换上的许多帖子,但我没有发现任何类似的内容。我的临时修复只是访问name_list并更新属于“Joe Edwards”的整个文档,但它并不真正优雅。有人可以帮忙吗?

谢谢。

共有1个答案

尚声
2023-03-14

MongoDB试图将驱动程序(包括Pymongo)的操作符与< code>mongo shell的操作符对齐。在最好的情况下,< code>mongo shell操作看起来与命令的Pymongo版本完全一样。因此,如果您找不到您需要的操作符,您可以在操作符文档页面中找到它

关于你的问题,根据你想做什么,有几个选项可供你选择:

更新现有数组元素

这可以使用<code>$

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

请注意<code>别名$ 操作,该操作将更新“Allen Dingus”的别名,并将其替换为“别名1”。对于示例文档,这将导致:

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

添加新的数组元素

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

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

这将搜索别名“艾伦·丁格斯”,并将新条目添加到数组中。对于您的示例文档,这将导致:

{
  "_id": ...,
  "name": "Joe Edwards",
  "aliases": [
    "Allen Dingus",
    "Edward McPickles",
    "Alias 2"
  ]
}
 类似资料:
  • 我正在开发基于Microsoft Azure的应用程序,使用Azure Cosmos触发器从集合中获取更改提要。我在单个集合中嵌套了记录。在UI中,用户可以修改嵌套记录。现在,我的要求是获取有关从UI修改的记录的信息,但cosmos触发器将返回集合中的所有数据,而我希望从嵌套集合中获取单个修改的记录。如果可行,对如何做到这一点有何建议?返回整个集合将花费太多时间来加载UI。

  • 问题内容: 我对脚本使用批量更新以更新嵌套字段,但这非常慢: 您知道另一种可能更快的方法吗? 为了不对每次更新重复执行脚本,似乎可以存储该脚本,但是我找不到保持“动态”参数的方法。 问题答案: 与性能优化问题一样,由于有许多可能导致性能不佳的原因,因此没有唯一的答案。 在您的情况下,您正在批量请求。当执行,该文件实际上是被重新索引: …要更新文档就是要对其进行检索,更改,然后为整个文档重新编制索引

  • 问题内容: 我使用此代码从Jhonny的Question中的json 对象中找到了所需的部分 数据样本 查找功能 像这样使用: 此代码是从源代码中选择匹配的片段。但是我想要的是用新值更新源对象并检索更新的源对象。 我想要类似的东西 我的密码 如果我给定但如果我将代码更改为未定义的更新,则此方法有效。 为什么呢? 问题答案: 您忘记在嵌套调用中传递newValue

  • 问题内容: 我在Scala和Java之间遇到编译问题。 我的Java代码需要一个 我的scala代码有一个 我收到编译错误: 似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以隐式转换为Iterable。除了遍历scala集合并手动进行转换之外,我还能做些什么使这些类型起作用? 问题答案: 应该弃用恕我直言。您最好使用来明确说明转换的时间和地

  • 我正在尝试使用实体图来触发加载的惰性集合,但不幸的是,实体图也会触发所有嵌套集合。我正在使用spring-data-jpa-entity-graph库在运行时创建实体图。 带有 JPA 存储库的 Spring 服务: 在这种情况下,服务还为每辆车返回零件收集,但我只想获取每个品牌的车辆收藏的品牌列表。 我们如何在第一级触发加载懒惰集合(仅限品牌车辆-没有车辆零件)?

  • 我有三个实体主题、主题和类别。在检索包含主题和主题的所有类别时,如何预取每个实体的id和名称列?我不需要其他字段,因为它会影响性能。