Description
> 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 : undefined
function 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]);