nodejs + mongo +查找+ $和错误:无法canonicalize查询

该查询是:

{$and:[ {phone:phone}, {$gte:{date:'2014-08-25'}}, {$lt:{date:'2014-08-30'}} ]} 

然后显示一个错误:

 { [MongoError: Can't canonicalize query: BadValue unknown top level operator: $gte] name: 'MongoError' } 

这个错误是什么意思?

你的整个查询结构是不正确的。 运营商以参数forms在“领域”上行事。 所以操作者以一种说话的方式作为一个“钥匙”是对这个领域的“价值”。

除了“所有”的MongoDB查询实际上是一个“和”查询。 只有在为同一字段指定多个条件的情况下, $and操作符本身才是必需的。 但是,这不是如何使用$gte$lt操作符进行“范围查询”,而是将它们“合并”在同一个“运算符文档”中:

 db.collection.find({ "phone": phone, "date": { "$gte": "2014-08-25", "$lte": "2014-08-30" } }) 

此外值得注意的是,这只适用于你的date实际上是“string”的地方。 你真正“应该”拥有的是你的集合中的“date对象”,它通常在shell中表示如下:

 ISODate("2014-08-29T17:51:30.428Z") 

这将帮助你,因为你可以用date做其他事情,同样也不需要“转换”这些代码中的任何其他操作。 当你有实际的“date对象”,那么你可以通过简单地使用其他date对象实例来查询它们,如下所示:

 db.collection.find({ "phone": phone, "date": { "$gte": new Date("2014-08-25"), "$lte": new Date("2014-08-30") } }) 

你需要做的

 {date: {$gte: '2014-08-25'}} 

同样也是$lt

http://docs.mongodb.org/manual/reference/operator/query/gte/#op._S_gte