【问题标题】:Trouble with $gt in mongoosemongoose 中 $gt 的问题
【发布时间】:2015-06-20 08:23:38
【问题描述】:

我已经通过以下查询成功地在 mongo CLI 中查询了我要执行的操作。

db.catches.find({'weightTotal': {'$gte' : 150} })

但是,当我尝试将查询从角度发送到这样的路线时(更具体一点):

Hatchery.getByLocation(
        {
            'x': $scope.y.x._id,
            'city': place.data[0].city,
            'weightTotal': {'$gte' : 150 }
        })

当猫鼬发生故障时,我得到了通常的错误:

TypeError: Cannot call method 'toString' of undefined
at ServerResponse.writeHead (http.js:1180:45)
at ServerResponse.writeHead (/Users/ShiftedRec/x/y/node_modules/express-session/node_modules/on-headers/index.js:53:19)

但更具体地说(控制台记录错误)

{ message: 'Cast to number failed for value "{"$gte":150}" at path "weightTotal"',
 name: 'CastError',
 kind: 'number',
 value: '{"$gte":150}',
 path: 'weightTotal' }

我已经通过在路由中执行.where 来实现此功能,但我宁愿将所有内容都放入查询中。如果我只是将我需要的内容传递到查询中,而不是根据权限等执行条件 where 语句,它可以让我的路线更整洁。

查询传递到的路由如下所示:

router.get('/', function (req, res, next) {
User
    .find(req.query)
    .populate('post')
    .exec(function (err, data){
        if (err) return next(err);
        res.json(data);
    });
});

req.query 控制台登录到这里:

{ x: '5581efdcc465c1ccd97a1f6b',
  y: '5581efe2458256f5d9848ca7',
  weightTotal: '{"$gt": 150}' }

我使用的是 Mongoose 4.0.1。 有什么想法吗?

【问题讨论】:

  • 如果没有负责查询数据库的 node.js 代码,这很难说。
  • 更多代码会有所帮助
  • 抱歉,添加了执行查询的路由

标签: angularjs node.js mongodb mongoose


【解决方案1】:

GET 请求查询是字符串,所以如果你发送这个:

www.mysite.com/?data=1&weightTotal=5

你会得到这个(字符串而不是数字):

{data: "1",
 weightTotal: "5"}

为了使用数据,您可以以某种方式对其进行解析,例如:

req.query.weightTotal = JSON.parse(req.query.weightTotal);

或者如果它只是一个数字,更快的解析是:

req.query.weightTotal = +req.query.weightTotal;

如果您在请求中发送对象,一个更聪明的解决方案是使用 POST 而不是 GET。

【讨论】:

  • JSON.parse 正是我所需要的。谢谢。
【解决方案2】:

先尝试将req.query.weightTotal字符串转换为对象:

req.query.weightTotal = eval('(' + req.query.weightTotal + ')');

查看下面的演示。

var obj = { 
    x: '5581efdcc465c1ccd97a1f6b',
    y: '5581efe2458256f5d9848ca7',
    weightTotal: '{"$gt": 150}' 
}
obj.weightTotal = eval('(' + obj.weightTotal + ')');

pre.innerHTML = JSON.stringify(obj);
<pre id="pre"></pre>

【讨论】:

  • 当然,因为我是通过http请求发送一个对象,所以它被转换成一个字符串,对吧?我认为循环遍历每个键在其上运行该行代码是明智的。你同意吗?
  • 有没有办法在不将 weightTotal 值转换为字符串的情况下传递对象?顶级对象到达时不是字符串,但内部对象是。这是为什么呢?
  • @Peege151 应该是可行的,更多细节请参考这个answer
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2017-01-19
  • 2015-10-26
相关资源
最近更新 更多