gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:30:47 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com