【问题标题】:Why doesn't this Mongoose query work?为什么这个 Mongoose 查询不起作用?
【发布时间】:2014-10-17 02:16:31
【问题描述】:
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
    }

【问题讨论】:

  • 将问题隔离到{ "area.max-lat" : { "$gte" : latitude } }"expiry" : { "$gt" : Date.now() }

标签: node.js mongodb mongoose


【解决方案1】:

你应该改变

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

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

您缺少 {} 并将 date.now 转换为字符串。它对我有用

【讨论】:

  • 我实际上在那个子查询周围加上了大括号,我只是在调试时复制了代码。我用你的代码尝试了一个简单的查找(没有and),但它仍然不起作用。打算尝试更新 MongoDB 和 Mongoose
  • remove '"expiry" : { "$gt" : Date.now() } ,',看看它是否工作,如果它工作你的查询由于时间比较而不起作用,转换把它串起来
  • 所以日期的东西仍然不起作用(toString 无效) - 我发现我的地图区域查询有问题 - 我的变量实际上是字符串(使用节点的主体解析器解析)。出于某种奇怪的原因,只有 max-lat 查询不起作用...
  • 你会注释掉日期子查询并将 lat 和 long 设置为字符串,看看结果是什么?我不明白为什么只有 max-lat sub-q 的字符串类型有问题,而其他的则没有。
  • 我的查询有效 ----------> 很好 db.test0.find( { $and: [ { 'expiry' : { $gt : Date.now().toString () }} ,{ 'area.min-lat' : { '$lte' : 33 } } ,{ 'area.max-lat' : { '$gte' : 35 } } ,{ 'area.min-long ' : { '$lte' : -85 } } ,{ 'area.max-long' : { '$gte' : -85 } } ] } );
【解决方案2】:

所以这里的问题是我的错,代码大部分是正确的。

首先,latitudelongitude 实际上是字符串(由 Express 的默认中间件解析)。不管出于什么奇怪的原因,只有max-lat 子查询被字符串类型抛出。将其注释掉将导致查询返回预期结果。 我对此的解决方案只是确保参数确实是一个浮点数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多