我需要将 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/