基本问题:
以下 2 个查询是否是等效的?
(A) coll.find(k1:v1, k2:v2) // List of fields
(B) coll.find($and: [{k1:v1}, {k2:v2}]) // $and the list of fields
如果是这样,为什么他们表现出不同的行为?(见下文)。如果没有,我如何在 C# 中生成前者?
进一步讨论
我正在索引子文档中的字段。查询 (A) 正确使用索引,但查询 (B) 没有。
这是一些示例代码(它将直接在 mongo 控制台中运行):
{
_id : Guid
..other stuff..
Fields: { K1: V1, K2: V2 ...}
}
// Populate
db.test.insert({_id:1,Fields:{K1:123,K2:456}})
db.test.insert({_id:2,Fields:{K1:456,K2:123}})
// Index on fields of subdocument
db.test.ensureIndex({"Fields.K1": 1})
db.test.ensureIndex({"Fields.K2": 1})...
// Execute some queries
db.test.find({_id: {$lt: 20}, "$or": [{"Fields.K1": 123}, {"Fields.K2": 123}]}).explain()
db.test.find({$and: [{_id: {$lt: 20}}, {"$or": [{"Fields.K1": 123}, {"Fields.K2": 123}]}]}).explain()
第一个查询按预期使用索引。第二个没有。
问题总结
- 这两个 find() 查询是否等效?
- 如果是这样,为什么他们的行为不同?如果不是,它们有何不同?
- 如何在没有 $ 和使用 C# 驱动程序的情况下生成 find()?
编辑--------
作为记录,我在 C# 中使用的语法类似于:
coll.find(Query.And([<id query>, <fields query>]));
手动生成 QueryDocument 不起作用,因为它不能包含多个 $or 查询,因为 $or 用作字典的键(我需要多个 $or 在我的实际查询中)。