为什么这个Mongoose查询不起作用?

时间:2014-10-16 15:27:12

标签: node.js mongodb mongoose

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
    }

2 个答案:

答案 0 :(得分:1)

你应该改变

"expiry" : { "$gt" : Date.now() } 

{ 'expiry' : { $gt : Date.now().toString() }}

你遗漏了{}并将date.now转换为字符串。它对我有用

答案 1 :(得分:1)

所以这里的问题是我的错,而且代码大多是正确的。

首先,latitudelongitude实际上是字符串(由Express&#39的默认中间件解析)。但是,出于任何奇怪的原因,只有max-lat子查询被字符串类型抛弃。注释掉会导致查询返回预期结果。 我的解决方案就是确保参数确实是浮点数。

接下来,我的expiry的日期只是一个字符串,真的应该是日期类型。我通过Mongoose创建了一个新对象,为它提供了一个本机Javascript日期类型,它存储为ISODate("2014-10-26T17:57:47.727Z")。我对{ "expiry" : { "$gt" : Date.now() } }的查询现在按预期工作。