基于时间的猫鼬老结果

时间:2016-10-13 12:44:32

标签: mongodb mongoose

我有以下代码:

 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?

2 个答案:

答案 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上的文档。