MongoDB:在具有未知键的对象中查找给定字段值的文档

2024-05-19

我正在建立一个关于论文/论点的数据库。它们与其他参数相关,我将这些参数放置在带有动态键 https://stackoverflow.com/questions/12393351/using-a-variable-in-mongodb-update,这是完全随机的。

{
    _id : "aeokejXMwGKvWzF5L",
    text : "test",
    relations : {
        cF6iKAkDJg5eQGsgb : {
            type : "interpretation",
            originId : "uFEjssN2RgcrgiTjh",
            ratings: [...]
         }
    }
}

如果我只知道这个文件的价值,我能找到这个文件吗?type是?那就是我想做这样的事情:

db.theses.find({relations['anything']: { type: "interpretation"}}})

这可以很容易地完成位置运算符 http://docs.mongodb.org/manual/reference/operator/update/positional/#up._S_, if relations曾经是一个数组。但是我无法对其中的对象进行更改ratings, 作为蒙戈不支持 https://stackoverflow.com/questions/10341151/mongodb-update-deep-array那些更新。我在这里询问是否可以不必更改数据库结构。


尽管您似乎由于使用嵌套数组时出现更新问题而接近了这种结构,但您实际上只是通过执行其他不受真正支持的操作而导致了另一个问题,那就是没有“通配符”使用最佳标准查询运算符搜索未指定键的概念。

真正搜索此类数据的唯一方法是使用服务器上的 JavaScript 代码来遍历键$where https://docs.mongodb.org/v3.0/reference/operator/query/where/。这显然不是一个好主意,因为它需要蛮力评估而不是使用索引等有用的东西,但可以按如下方式处理:

db.theses.find(function() {
    var relations = this.relations;
    return Object.keys(relations).some(function(rel) {
        return relations[rel].type == "interpretation";
    });
))

虽然这将从集合中返回包含所需嵌套值的对象,但它必须检查集合中的每个对象才能进行评估。这就是为什么这样的评估实际上应该只在与可以直接使用索引而不是作为集合中对象的硬值的东西配对时使用。

更好的解决方案仍然是考虑重构数据以利用搜索中的索引。如果需要更新“收视率”信息,那么基本上“压扁”将每个“评级”元素视为唯一数组数据的结构:

{
    "_id": "aeokejXMwGKvWzF5L",
    "text": "test",
    "relationsRatings": [
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 1,
            "ratingScore": 5
        },
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 2,
            "ratingScore": 6
        }
   ]
}

现在搜索当然非常简单:

db.theses.find({ "relationsRatings.type": "interpretation" })

当然还有位置性的$ https://docs.mongodb.org/v3.0/reference/operator/update/positional/运算符现在可以与更扁平的结构一起使用:

db.theses.update(
    { "relationsRatings.ratingId": 1 },
    { "$set": { "relationsRatings.$.ratingScore": 7 } }
)

当然,这意味着每个“评级”值的“相关”数据的重复,但这通常是按匹配位置更新的成本,因为这仅是单层数组嵌套所支持的。

因此,您可以强制逻辑与您的结构方式相匹配,但这不是一个好主意,并且会导致性能问题。然而,如果您在这里的主要需求是更新“评级”信息,而不仅仅是附加到内部列表,那么更扁平的结构将带来更大的好处,当然搜索速度也会更快。

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

MongoDB:在具有未知键的对象中查找给定字段值的文档 的相关文章

随机推荐

  • ASP.net Gridview 分页在 UpdatePanel 中不起作用

    虽然类似的问题已经被问过很多次了 但问题仍然没有解决 这是问题 我有一个GridView它包含在选项卡容器中AJAX控件本身位于UpdatePanel Gridview工作得很好并且其相应的方法被准确地触发 但是当我启用paging 例如
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 通过身份验证保护 CodeIgniter 2 应用程序的正确方法是什么?

    I have Ion Auth http benedmunds com ion auth 正确安装并在我的服务器上运行 我也有默认的代码点火器2 新闻 教程在同一个 CI 安装中工作 我只是在玩 并对使用身份验证系统 封闭 或保护整个应用程
  • 如何将我的 pod 日志存储在持久存储中?

    我已经使用以下命令为我的 Pod 生成了日志kubectl logs pod name 但我想将这些日志保存在一个卷 某种持久存储 中 因为如果 Pod 宕机 容器日志将被清除 有没有办法做到这一点 我必须写某种脚本吗 我已经阅读了很多答案
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • Kubernetes 中可以连接两个集群 IP 服务吗?

    情况是我想连接一个租户内的两个集群IP服务 该租户已经将Traefik作为NodePort 以便这两个服务中的任何一个都可以成为LoadBalancer 因为NodePort由Traefik使用 我尝试连接的两个服务的工作方式如下 第一个服
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 防止纸张对话框自动关闭

    Hello 我有一个paper dialog页面中的元素
  • 如何根据 ggplot2 中的汇总数据创建堆积条形图

    我正在尝试使用 ggplot 2 创建堆积条形图 我的宽格式数据如下所示 每个单元格中的数字是响应的频率 activity yes no dontknow Social events 27 3 3 Academic skills works
  • 使当前提交成为 Git 存储库中唯一(初始)提交?

    我目前有一个本地 Git 存储库 我将其推送到 Github 存储库 本地存储库有约 10 次提交 Github 存储库是其同步副本 我想要做的是从本地 Git 存储库中删除所有版本历史记录 以便存储库的当前内容显示为唯一提交 因此存储库中
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 逃离 Pig 中的美元符号?

    这在 0 9 2 中不是问题 但在 0 10 中 当我尝试访问地图中带有美元符号的键时 我会遇到没有定义变量的错误 具体来说 blah FOREACH meh GENERATE source json post id id AS post
  • 图像目录中矢量 pdf 的渲染模式设置为模板,但 UIImageView 不会在自定义单元格中对图像进行着色

    我已将所有图像文件迁移到资产目录中 它们都是大小为 1x 的 pdf 向量 它们被设置为呈现为模板 它们的大小和颜色在任何地方都表现得很好 但是有一个来自 xib 的自定义 TableView Cell 我有 6 个 UIImageView
  • 哈希上的多次迭代:这不会减少熵吗?

    我看到在很多地方 包括堆栈 都推荐了这种技术 而且我无法摆脱这种技术会减少熵 毕竟 您正在再次对已经被散列过并且有碰撞机会的东西进行散列 碰撞机会大于碰撞机会会不会导致更多的碰撞机会 经过研究 似乎我错了 但为什么呢 既然您标记了 md5
  • 如何使用 NHibernate 标准来做到这一点

    假设我有 2 张桌子 表1 a b 和表2 c a 我需要做这样的事情 但符合 NHibernate 标准 select a b select count from table2 t2 where t1 a t2 a x from tabl
  • 如何从任何网站下载视频

    我只是想知道如何从任何网站下载视频的总体思路 我尝试的事情 我检查页面 在视频属性标记中看到 blob URL 将 blob URL 复制粘贴到浏览器中 但无法打开 I also look around the Developer tool
  • 通过 PowerShell 运行 .cmd 文件

    我正在尝试使用 PowerShell 在远程服务器上运行 cmd 文件 在我的 ps1 脚本中我尝试过 C MyDirectory MyCommand cmd 它会导致此错误 C MyDirectory MyCommand cmd is n
  • MongoDB:在具有未知键的对象中查找给定字段值的文档

    我正在建立一个关于论文 论点的数据库 它们与其他参数相关 我将这些参数放置在带有动态键 https stackoverflow com questions 12393351 using a variable in mongodb updat