> 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]);