您真的不希望为此进行聚合,因为这意味着强制计算将匹配项结合起来。
相反,您想要将源数据从“不合格”键名重新映射为“完全合格”键名以在查询中使用。
例如:
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接受一组条件,并且“列表”中唯一缺少的是要匹配的键尚未使用“点符号”作为完整路径的前缀,包括"prop3".
当常规查询实际上甚至可以使用索引只要这些属性路径不改变就可以有效和高效地完成工作时,没有强制计算之类的“偏好”