nodejs + mongo + find + $和错误:不能规范化查询

时间:2014-08-30 02:45:05

标签: node.js mongodb mongodb-query

查询是:

{$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' }

这个错误的含义是什么?

2 个答案:

答案 0 :(得分:3)

您的整个查询结构确实不正确。运算符以参数形式作用于“字段”。因此,操作员对于该领域的“价值”是一种说话方式的“关键”。

除了“所有”MongoDB查询实际上隐含的是“和”查询。只有在为同一字段指定多个条件时,才需要$and运算符本身。但这不是您使用$gte$lt运算符进行“范围查询”的方式,而是将它们“组合”在同一个“运算符文档”中:

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

此处值得注意的是,这仅适用于日期实际为“字符串”的情况。你真正“应该”拥有的是你的集合中的“日期对象”,它通常在shell中表示如下:

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

这将对您有很大帮助,因为您可以使用日期执行其他操作,同样不需要将这些“转换”为代码中的任何其他操作。如果您有实际的“日期对象”,那么您只需使用其他日期对象实例来查询它们:

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

答案 1 :(得分:1)

你需要做

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

同样适用于$lt

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