在数组的同一嵌入文档中使用$和两个条件进行查询

时间:2016-08-24 09:09:08

标签: mongodb mongodb-query

让我试着简要解释一下我的案子。我是MongoDB的新手。我正试图摆脱CouchDB并探索我的选择。

示例文档可能如下所示(缩短,简化):

{
  exp: [
    {
      isCurrent: true,
      name: 'Name 1'
    },
    {
      isCurrent: false,
      name: 'Name 2'
    }
  ]
}

索引如下:

{
  "exp.name":1,
  "exp.foo":1,
  "exp.bar":1
}, {
  partialFilterExpression:{ "exp.isCurrent": {$eq: true}}
}

是的,“foo”和“bar”似乎多余,但它们是我当前索引的一部分,我认为它们不会扭曲结果。

我们的想法是仅对“当前”的“exp”行进行索引。现在,如果我使用如下的查询:

{$and:[{"exp.name":"Name 2"},{"exp.isCurrent":true}]}

...上述文件仍然满足查询。为什么?更重要的是,我该怎么做我想做的事情?这甚至可能吗?看起来简单,例如Google BigQuery会将$and应用于同一REPEATED条记录中的字段(并在此方案中返回结果)。

或者,我的“isCurrent:true”始终为[0]。我可以利用它来准确,更有效地编写查询吗?

2 个答案:

答案 0 :(得分:2)

显示的文件是因为exp [1] .name =“Name 2”和exp [0] .isCurrent为真。

partialFilterExpression仅告诉mongodb在exp.isCurrent为true时不索引文档。它不会阻止你找到它。

如果你想确保你的返回exp [i] .name =“name 2”和exp [i] .isCurrent(我可以是0到n)同时为真,试试这个:

db.test.find({"exp":{$elemMatch:{$and:[{"name":"Name 1"},{"isCurrent":true}]}}})

如果您想要查询数组的第一个元素,可以这样做:

 db.test.find({$and:[{"exp.0.name":"Name 1"},{"exp.0.isCurrent":true}]})

希望有所帮助

答案 1 :(得分:0)

文档满足查询,因为$并对两个或多个表达式(例如expression1,expression2等)的数组执行逻辑AND运算,并选择满足数组中所有表达式的文档。从这里。 https://docs.mongodb.com/manual/reference/operator/query/and/

要获得欲望结果,您可以使用一些缩小或映射或过滤重新调整的结果。例如,你做

 coll.find({"exp.name":"Name 2"});

然后对结果应用过滤器。

也许可以尝试更改架构。将所有数据放入像这样的单独对象

{name1: {current: true, name: "test"}, name2: {current: false, name: "another"}}

现在你可以查询

coll.find({'name2.current': false});

希望这有帮助。