查询或条件

时间:2017-10-23 09:02:56

标签: mongodb mongodb-query aggregation-framework

我想以这样一种方式查询mongoDB,即以对象数组的形式传递查询。 每个对象都是

的形式
{
name: "<someName>",
someArr: [<someArr>]
}

现在,我想以这样的方式查询数据库:为了使文档适合查询,它必须满足两个条件:

  1. 该文档必须与查询的对象名称属性具有相同的名称
  2. 文档的 someArr 属性必须是查询对象 someArr 的子集,前提是条件1为真。
  3. 如果查询是单个对象,我可以使用$ match和$ unwind查询它。

    所以我想知道是否可以使用mongoDB的对象数组进行查询,还是必须为每个查询对象进行循环?

    由于


    一个例子:

    如果查询是:

    [
      {name: "test", someArr: [1,2]},
      {name: "test2", someArr: [3]}
    ]
    

    数据库包含以下内容:

    [
    {name: "test3", someArr: [1,2]},
    {name: "test", someArr: [1]},
    {name: "test2", someArr: [4]}
    ]
    

    查询结果应为

    [{name: "test", someArr: [1]}]
    

    因为它只匹配两个条件。

1 个答案:

答案 0 :(得分:1)

这里没有必要“聚合”任何东西。这是一个简单的查询。您所做的就是将您的初始“查询阵列”转换为所需的实际查询DSL。而这只是在someArr上加$in并将整个数组提供给$or

var conditions = [
  {name: "test", someArr: [1,2]},
  {name: "test2", someArr: [3]}
];

db.collection.find({
  "$or": conditions.map( c => Object.assign(c, { someArr: { "$in": c.someArr } }) )
})

为清楚起见,这个变换从源数组产生了这个:

db.collection.find({
  "$or": [
    {name: "test", someArr: { "$in": [1,2] } },
    {name: "test2", someArr: { "$in": [3] } }
  ]
})

然后返回正确的文档。

“子集”有效地意味着“共享至少一个元素”,这就是$in作为查询运算符所做的事情。因此,除非是出于投影目的,否则无需进行任何进一步的计算。