让我试着简要解释一下我的案子。我是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]。我可以利用它来准确,更有效地编写查询吗?
答案 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});
希望这有帮助。