mirror of https://github.com/mongodb/mongo
64 lines
2.6 KiB
JavaScript
64 lines
2.6 KiB
JavaScript
// Cannot implicitly shard accessed collections because queries on a sharded collection are not
|
|
// able to be covered when they aren't on the shard key since the document needs to be fetched in
|
|
// order to apply the SHARDING_FILTER stage.
|
|
// @tags: [
|
|
// assumes_unsharded_collection,
|
|
// requires_getmore,
|
|
// ]
|
|
|
|
// Test indexing of decimal numbers
|
|
// Include helpers for analyzing explain output.
|
|
import {isIndexOnly} from "jstests/libs/query/analyze_plan.js";
|
|
|
|
let t = db.decimal_indexing;
|
|
t.drop();
|
|
|
|
// Create doubles and NumberDecimals. The double 0.1 is actually 0.10000000000000000555
|
|
// and the double 0.3 is actually 0.2999999999999999888, so we can check ordering.
|
|
assert.commandWorked(t.insert({x: 0.1, y: NumberDecimal("0.3000")}));
|
|
assert.commandWorked(t.insert({x: 0.1}));
|
|
assert.commandWorked(t.insert({y: 0.3}));
|
|
|
|
// Create an index on existing numbers.
|
|
assert.commandWorked(t.createIndex({x: 1}));
|
|
assert.commandWorked(t.createIndex({y: -1}));
|
|
|
|
// Insert some more items after index creation. Use _id for decimal.
|
|
assert.commandWorked(t.insert({x: NumberDecimal("0.10")}));
|
|
assert.commandWorked(t.insert({_id: NumberDecimal("0E3")}));
|
|
assert.writeError(t.insert({_id: -0.0}));
|
|
|
|
// Check that we return exactly the right document, use an index to do so, and that the
|
|
// result of the covered query has the right number of trailing zeros.
|
|
let qres = t.find({x: NumberDecimal("0.1")}, {_id: 0, x: 1}).toArray();
|
|
let qplan = t.find({x: NumberDecimal("0.1")}, {_id: 0, x: 1}).explain();
|
|
assert.neq(
|
|
tojson(NumberDecimal("0.1")),
|
|
tojson(NumberDecimal("0.10")),
|
|
"trailing zeros are significant for exact equality",
|
|
);
|
|
assert.eq(qres, [{x: NumberDecimal("0.10")}], "query for x equal to decimal 0.10 returns wrong value");
|
|
assert(isIndexOnly(db, qplan.queryPlanner.winningPlan), "query on decimal should be covered: " + tojson(qplan));
|
|
|
|
// Check that queries for exact floating point numbers don't return nearby decimals.
|
|
assert.eq(
|
|
t.find({x: 0.1}, {_id: 0}).sort({x: 1, y: 1}).toArray(),
|
|
[{x: 0.1}, {x: 0.1, y: NumberDecimal("0.3000")}],
|
|
"wrong result for querying {x: 0.1}",
|
|
);
|
|
assert.eq(
|
|
t.find({x: {$lt: 0.1}}, {_id: 0}).toArray(),
|
|
[{x: NumberDecimal("0.10")}],
|
|
"querying for decimal less than double 0.1 should return decimal 0.10",
|
|
);
|
|
assert.eq(
|
|
t.find({y: {$lt: NumberDecimal("0.3")}}, {y: 1, _id: 0}).toArray(),
|
|
[{y: 0.3}],
|
|
"querying for double less than decimal 0.3 should return double 0.3",
|
|
);
|
|
assert.eq(
|
|
t.find({_id: 0}, {_id: 1}).toArray(),
|
|
[{_id: NumberDecimal("0E3")}],
|
|
"querying for zero does not return the correct decimal",
|
|
);
|