我有以下代码:
var dates = getDates();
var a = dates.now;
var tomorrow = dates.tomorrow;
console.log("{userid: " + userid + ", time: {$gte: " + a + "}, time: {$lte: " + tomorrow +"}");
tickets.find({userid: userid, time: {$gte: a}, time: {$lte: tomorrow}}).then(function (usertickets) {
console.log(usertickets[0]);
return resolve(usertickets);
});
控制台日志:
{userid: 57e0fa234f243f0710043f8f, time: {$gte: 1476309600000}, time:
{$lte: 1476396000000}
控制台日志结果输出:
{ userid: '57e0fa234f243f0710043f8f',
username: 1,
fromticket: 1,
amount: 1,
toticket: 2,
time: '1474362076461',
__v: 0,
_id: 57e0fadce32462ca1036274d }
问:那个时间1474362076461是如何结果的,而结果应该是1476309600000还是1476396000000?
答案 0 :(得分:1)
您将数值作为字符串,当您比较字符串中的数值时,它对ex的工作方式不同。
console.log('2'>'11')
它会打印出来。所以将架构更改为Number。
答案 1 :(得分:1)
您当前的查询
{
userid: userid,
time: {$gte: a}, /* MongoDB ignores this first expression */
time: {$lte: tomorrow}
}
返回时间值为1474362076461
的文档,因为当查询按照您的方式构建时,MongoDB会忽略第一个键表达式time: {$gte: a}
并将JSON计算为
{
userid: userid,
time: {$lte: tomorrow}
}
和
'1474362076461' <= 1476396000000
评估为true所以基本上它使用 $lte
比较查询时间字段部分上的集合,并忽略其他重复键。有关上述JSON有效性的深入信息,请参阅此问题Does JSON syntax allow duplicate keys in an object?
作为修复,您需要将两个比较运算符保持在一个键下,以便查询对象变为有效的JSON,并且比较运算符嵌入在子文档中,即您的查询应该是
{
userid: userid,
time: { $gte: a, $lte: tomorrow }
}
让这个工作。
此外,您应该知道您正在将字段与不同类型进行比较,因为db中的time
字段是一个字符串,而在上面您将它与整数进行比较。为比较目的,MongoDB将某些类型视为等效类型。例如,数字类型在比较之前进行转换,因此查询工作正常。
有关详细信息,请参阅Comparison/Sort Order上的文档。