如何在这种嵌套文档结构(MongoDB)中进行查询?

2023-12-20

(抱歉,如果这是一个微不足道的问题。)

我的文档看起来像这样(Python 语法):

{
  '_id': SomeObjectId,
  'features': [ 
                {'id': 'featureX' , 'value': 6},
                {'id': 'featureY', 'value': 45}
              ]
}

通过这种结构,可以轻松找到功能列表中包含“featureX”的所有文档。但我也有兴趣检索子文档中关联的值。 我想在Python中如果我通过这样的查询获取文档:db.articles.find({'features.id': 'featureX'})那么我需要迭代数组“features”以找出正确的“值”。

是否有其他类型的查询可以为我提供有趣的值(在这种情况下,我不需要检索完整文档,只需检索带有 {'id': 'featureX', 'value': 6} 的部分,其中不会位于数组中可预测的索引值。

PS:我想我会以不同的方式设计文档,但我仍然有兴趣知道上面的请求是否可行。

这是新的结构:

{
'_id': SomeObjectId,
'features': { 
              'featureX': { 'someproperty':'aaa', 'value':6 }, 
              'featureY': {'someproperty' :'bbb', 'value':45} 
            }
}

这个设计有什么问题吗? 就我而言,“featureS”、“featureS”是唯一的,因此将它们用作字典键不是问题。

编辑: 我需要澄清的是,我需要自动更新文档中的“featureX”和“featureY”,并且MongoDB不支持事务 https://jira.mongodb.org/browse/SERVER-2804。 此外,第二种设计虽然不允许检索子文档,但应该可以轻松地在客户端代码中快速获取所需的信息,假设我可以查询具有特定键的子文档。

我认为这个查询应该完成这项工作:

result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']

我已经回答过几次关于从 mongo 集合中单独获取子文档的问题here https://stackoverflow.com/questions/7692865/mongodb-querying-array-elements-within-a-document/7702608#7702608, and here https://stackoverflow.com/questions/7554370/how-to-find-the-matched-record-in-mongodb/7555074#7555074

目前根本没有办法做到这一点。这是过滤多级嵌入文档的行为,通常匹配过滤器会返回整个文档,而不是子集。

mongo 中已经存在两个与此相关的未决问题字段中的位置 ($) 运算符返回说明符 https://jira.mongodb.org/browse/SERVER-828 and 能够利用子文档的数据,其内容用于满足使用 $ 运算符的查询 https://jira.mongodb.org/browse/SERVER-3089。 (如果您确实需要该功能,请登录投票)

而且您的备用模式在这里也没有用。

因此,您必须将每个功能存储在单独的文档中,如下所示,以使其按照您想要的方式工作

特点1

{
'_id': SomeObjectId,
'name' :'some name',
'value': 'feature 1',
'some_field' : 'zzz'
}

特点2

{
'_id': SomeObjectId,
'name' :'some name',
'value': 'feature 2',
'some_field' : 'zzz'
}

并查询

db.features.find({'_id':someobjectid})

只会返回特定的功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在这种嵌套文档结构(MongoDB)中进行查询? 的相关文章

  • 聚合和展开数组,但保留顶级键

    假设我的收藏中有以下文档Classes收藏家 id ObjectId 5df58d45244a850d54b922c8 mentors numOfMentors NumberInt 1 mentorList ObjectId 5c9ba63
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • 如何验证 ObjectID

    使用 Joi 模式验证 是否可以针对 MongoDB ObjectID 进行验证 像这样的事情可能很棒 id Joi ObjectId required error errorParser 我发现如果我这样做 Joi object id J
  • Mongodb 数据库上的 SASL 身份验证失败

    我在尝试使用 PHP Mongodb 驱动程序连接到 Mongodb 时遇到问题 实际上我有一个名为 LRS 的数据库 它有一个名为 juano 的用户 在我的设置文件中带有密码 12345 我确信我编写了正确的配置 但是当我在 Larav
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 为 Meteor 数据创建编号列表

    有没有办法获取 Meteor 集合中项目的编号列表的 编号 我知道我可以在 html 中做到这一点 但我觉得如果我可以在 spacebars 中放置一些东西 那么样式会更容易 如果我可以使用更好的术语 请告诉我 像这样的东西 前 20 部电
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • 获取对象数组中每个嵌套对象的虚拟属性?

    所以我知道如何获取单个虚拟属性 如 Mongoose 文档中所述 PersonSchema virtual name full get function return this name first this name last 但如果我的
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • spring-data-mongodb 在重新水化对象时到底如何处理构造函数?

    我读过了http static springsource org spring data data mongo docs 1 1 0 RELEASE reference html mapping chapter http static sp
  • 使用 PHP 从 Mongo 解码 JSON

    我已经看过这个线程 PHP 解码嵌套 JSON https stackoverflow com questions 3555335 php decode nested json并没有设法用它来解决我的问题 我目前正在从 Mongo 获取 J
  • 管理员未授权 Mongodb 执行 listDatabases 命令

    删除 mongodb 用户后 无法重新连接 mongo 没有 验证 我创造了超级用户 https docs mongodb org v2 6 reference built in roles superuser roles tomuser
  • 如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

    我有从 MongoRepository 扩展的接口 他们使用默认数据库 mongodb 我想定义类的数据库名称 public interface CustomerRepository extends MongoRepository
  • 通过在 body、mongoose/mongodb 中提供文档来更新多个文档

    我需要通过在正文中提供一些文档来更新它们 我无法查询它们 必须提供它们 Example var persons id 1 name Joe active false id 2 name Jane active false 该数据在正文中提供
  • 匹配包含 MongoDB 中提供的数组的任意组合的数组字段

    我想使用指定的数组元素列表进行查询 以便返回的文档只能包含我传递的元素 但不需要包含所有元素 鉴于以下文件 name Article 1 tags Funny Rad name Article 2 tags Cool Rad name Ar
  • 如何停止在 mongodb 集合中插入重复文档

    让我们有一个MongoDB包含三个文档的集合 db collection find id user A title Physics Bank Bank A id user A title Chemistry Bank Bank B id u
  • 是否有一个好的开源 MongoDB 队列 C# 驱动程序实现

    并不是说编写一个程序不够容易 或有趣 可以说 不重新发明轮子是有道理的 我已经浏览了各种尝试 但我似乎还没有遇到支持这些标准的实现 具有MongoDB持久化的简单队列OSS系统 基于 C 驱动程序 官方 如此完整的 POCO 序列化 可尾游
  • mongodb 和 pymongo 文档大小 16Mb 限制

    我正在使用 Windows 上的 showIncludes 标志和 nix 上的 H 标志来分析构建中的包含内容 我正在用 python 脚本解析这些信息 包含的每个文件都变成一个对象 列出其子文件 它包含的文件 和祖先 包含该文件的包含路

随机推荐