javascript - 将文档中的嵌套对象与可能匹配的数组进行匹配

标签 javascript mongodb mongodb-query aggregation-framework

我需要将 Mongo 文档中的嵌套对象与一组可能的匹配项进行匹配。

文档如下所示:

{
  prop1: ...,
  prop2: ...,
  prop3: {
    p3a: 1,
    p3b: 7,
    p3c: 1051
  }
}

我有一系列 prop3 的潜在匹配项:

[ { p3a: 1, p3b: 7, p3c: 1051 }, { p3a: x, p3b: y, p3c: z}, ... ]

有没有办法执行这种匹配?最好使用聚合框架,但即使可以以其他方式执行它,那仍然可以工作。

  • 无法更改模型的结构,它有很多与之相关的旧代码,因此即使它不是最佳的,我也必须使用它或围绕它进行工作。

最佳答案

您确实不希望为此进行聚合,因为这意味着强制计算将匹配项结合起来。

您想要的是将源数据从“非限定”键名称重新映射到“完全限定”键名称以在查询中使用。

例如:

 var arr = [ { p3a: 1, p3b: 7, p3c: 1051 }, { p3a: 'x', p3b: 'y', p3c: 'z'} ]

可以转换:

 arr = arr.map(d => 
   Object.keys(d).reduce((o,k) => Object.assign(o, { [`prop3.${k}`]: d[k] }),{}));

使用 ES6 风格的 JavaScript 更干净一些,但 mongo shell 不支持更新的语法:

 arr = arr.map(d =>
   Object.entries(d).reduce((o,[k,v]) => ({ ...o, [`prop3.${k}`]: v }),{}) );

现在列出的是:

[
        {
                "prop3.p3a" : 1,
                "prop3.p3b" : 7,
                "prop3.p3c" : 1051
        },
        {
                "prop3.p3a" : "x",
                "prop3.p3b" : "y",
                "prop3.p3c" : "z"
        }
]

现在您只需使用 $or 进行查询即可:

db.collection.find({ $or: arr })

这就是您需要做的所有事情,如 $or接受条件数组,“列表”中唯一缺少的是要匹配的键尚未使用 "dot notation" 作为前缀。包含 "prop3" 的完整路径。

当常规查询实际上甚至可以使用索引(只要这些属性路径不改变)就能有效且高效地完成工作时,不存在强制计算的“偏好”之类的事情

关于javascript - 将文档中的嵌套对象与可能匹配的数组进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50507858/

相关文章:

node.js - 如何检索包含某些参数排除在 mongo 的嵌套数组中的文档?

作为独立库的 Javascript 查询选择器 DSL

Mongodb 查找记录花费太多时间

javascript - 在 Java 中使用 JavaScript Cookie 下载文件

javascript - 我有一个单选按钮可以更改我页面上的 html 内容,但在一种情况下无法使其正常工作

javascript - 由samplerCube引起的GL_INVALID_OPERATION

mongodb - Mongodb 从现有日期字段添加时间戳字段

javascript - 运行函数以在 .load 完成时对内容进行动画处理

mongodb - Mongo聚合根据字段名收集数组元素

node.js - Mongodb 排序返回未定义