> db.test.ensureIndex({num:1})
WriteResult({ "nInserted" : 1 })
> db.test.ensureIndex({words:"text"})
WriteResult({ "nInserted" : 1 })
> db.test.insert({_id:1, num: 0})
WriteResult({ "nInserted" : 1 })
> db.test.insert({_id:2, num: 0, words:"foo"})
WriteResult({ "nInserted" : 1 })
> db.test.find({num:0, $or:[{_id:2}, {$text:{$search:"foo"}}]})
{ "_id" : 1, "num" : 0 } // wrong! this doc doesn't match either clause of the $or.
{ "_id" : 2, "num" : 0, "words" : "foo" }
> db.test.find({num:0, $or:[{_id:2}, {$text:{$search:"foo"}}]}).explain(true)
{
"cursor" : "BtreeCursor num_1", // invalid plan! queries with TEXT must choose text index plan.
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 4,
"nscannedAllPlans" : 6,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 2,
"indexBounds" : {
"num" : [
[
0,
0
]
]
},
"allPlans" : [
{
"cursor" : "BtreeCursor num_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0,
"indexBounds" : {
"num" : [
[
0,
0
]
]
}
},
{
"clauses" : [
{
"cursor" : "TextCursor",
"n" : 0,
"nscannedObjects" : 1,
"nscanned" : 1,
"scanAndOrder" : false,
"nChunkSkips" : 0
},
{
"cursor" : "BtreeCursor _id_",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 0,
"scanAndOrder" : false,
"indexOnly" : true,
"nChunkSkips" : 0,
"indexBounds" : {
"_id" : [
[
2,
2
]
]
}
}
],
"cursor" : "QueryOptimizerCursor", // the correct plan!
"n" : 0,
"nscannedObjects" : 1,
"nscanned" : 1,
"scanAndOrder" : false,
"nChunkSkips" : 0
},
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 1,
"nscanned" : 3,
"nChunkSkips" : 0
}
],
"server" : "Rassi-MacBook-Pro.local:27017",
"filterSet" : false,
"stats" : {
"type" : "KEEP_MUTATIONS",
"works" : 4,
"yields" : 0,
"unyields" : 0,
"invalidates" : 0,
"advanced" : 2,
"needTime" : 0,
"needFetch" : 0,
"isEOF" : 1,
"children" : [
{
"type" : "FETCH",
"works" : 3,
"yields" : 0,
"unyields" : 0,
"invalidates" : 0,
"advanced" : 2,
"needTime" : 0,
"needFetch" : 0,
"isEOF" : 1,
"alreadyHasObj" : 0,
"forcedFetches" : 0,
"matchTested" : 2,
"children" : [
{
"type" : "IXSCAN",
"works" : 2,
"yields" : 0,
"unyields" : 0,
"invalidates" : 0,
"advanced" : 2,
"needTime" : 0,
"needFetch" : 0,
"isEOF" : 1,
"keyPattern" : "{ num: 1.0 }",
"boundsVerbose" : "field #0['num']: [0.0, 0.0]",
"isMultiKey" : 0,
"yieldMovedCursor" : 0,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0,
"matchTested" : 0,
"keysExamined" : 2,
"children" : [ ]
}
]
}
]
}
}
Original description:
With the following query, the last assertion failed.
assert: [[ 1, 2, 3, 4, 5, 6 ]] != [[ 2, 3, 4, 5 ]] are not equal : undefinedfunction expectedIds(cursor, expectedIds) { var results = cursor.toArray() var ids = results.map(function(result){ return result._id; }); assert.eq(ids.sort(), expectedIds); } db.test.drop() db.test.insert({ _id: 1, words: "dog", num: 3 }) db.test.insert({ _id: 2, words: "dog cat", num: 3}) db.test.insert({ _id: 3, words: "dog cat cat", num: 1, loc: [ 20, 20 ] }) db.test.insert({ _id: 4, words: "dog cat cat", num: 2, loc: [ 40, 40 ] }) db.test.insert({ _id: 5, words: "cat", num: 4, array: [ { a: 1, b: 2 }, { a: 1, b: 0 } ] }) db.test.insert({ _id: 6, words: "gato", num: 5, language: "spanish" }) db.test.dropIndexes(); db.test.ensureIndex({ words: "text" }); db.test.ensureIndex({ num: 1 }); var query_or1 = { $or: [ { $text: { $search: "cat"} }, { num: 2 }] }; // [2, 3, 4, 5] var query_or2 = { $or: [ { _id: { $gt: 4 } }, { num: { $lt: 4 } } ]}; // [1, 2, 3, 4, 5, 6] var query_and = { $and: [ query_or1, query_or2 ]}; expectedIds(db.test.find(query_or1), [2, 3, 4, 5]); expectedIds(db.test.find(query_or2), [1, 2, 3, 4, 5, 6]); expectedIds(db.test.find(query_and), [2, 3, 4, 5]);