var latitude = 34
var longitude = -84
MyModel.find({
"$and": [
{ "expiry" : { "$gt" : Date.now() } }
,{ "area.min-lat" : { "$lte" : latitude } }
,{ "area.max-lat" : { "$gte" : latitude } }
,{ "area.min-long" : { "$lte" : longitude } }
,{ "area.max-long" : { "$gte" : longitude } }
]
},
function(err, matches){
if (!err) {
callback(matches, null)
} else { // there was an error
console.log(err);
callback(null, err);
}
});
执行但不会失败,但继续不返回任何内容。我试过隔离到期时间和地图区域部分,但都不起作用。然而,如果我只是做find()
或将比较更改为$ ne,我会得到我的结果。
数据库中只有一个对象我试图进行测试...
"_id" : "543ee4e4e55422ab155f0a44",
"name" : "Test Location Space",
"img-url" : "http://s3.amazonaws.com/test/test/32098mfsnsdj09w.jpg",
"expiry" : "2016-01-17T08:42:12.586Z",
"area" : {
"min-lat" : 33,
"max-lat" : 35,
"min-long" : -85,
"max-long" : -83
}
答案 0 :(得分:1)
你应该改变
"expiry" : { "$gt" : Date.now() }
到
{ 'expiry' : { $gt : Date.now().toString() }}
你遗漏了{}
并将date.now转换为字符串。它对我有用
答案 1 :(得分:1)
所以这里的问题是我的错,而且代码大多是正确的。
首先,latitude
和longitude
实际上是字符串(由Express&#39的默认中间件解析)。但是,出于任何奇怪的原因,只有max-lat
子查询被字符串类型抛弃。注释掉会导致查询返回预期结果。
我的解决方案就是确保参数确实是浮点数。
接下来,我的expiry
的日期只是一个字符串,真的应该是日期类型。我通过Mongoose创建了一个新对象,为它提供了一个本机Javascript日期类型,它存储为ISODate("2014-10-26T17:57:47.727Z")
。我对{ "expiry" : { "$gt" : Date.now() } }
的查询现在按预期工作。