6

我正在使用后端的 Mongodb 开发 nodejs/express 应用程序。在我的一个 API 调用中,取决于特定查询字符串参数的存在或另一个我想使用 $gt 或 $lt 向 Mongodb 发出查询。

在某些情况下,我们想要比tokenIdusing $lt 少的东西,但在其他情况下,我们想要比tokenIdusing $gt 更大的东西。我们如何在不重复查询的情况下做到这一点?

这是一个示例查询:

collection.find({'film_id': {$in : genre}, '_id': {$lt: tokenId}}).sort({'_id': -1}).limit(25).toArray(function(error, films)

有没有办法在不实际执行 2 个不同查询的情况下动态创建查询?

4

2 回答 2

17

以编程方式构建您的查询对象:

var query = {'film_id': {$in : genre}};
if (param) {
    query._id = {$lt: tokenId};
} else {
    query._id = {$gt: tokenId};
}
collection.find(query).sort({'_id': -1}).limit(25).toArray(function(error, films);

更新

现在 Node.js 4+ 支持计算属性名称,您可以query一步创建:

var query = {
    film_id: {$in: genre},
    _id: {[param ? '$lt' : '$gt']: tokenId}
};
于 2012-12-01T17:13:33.277 回答
0

上面的代码可能不起作用。上述动态查询将解析为以下 Ex。令牌是一个整数 35。

collection.find("_id":"{$gt: 35}")
          .sort({'_id': -1}).limit(25).toArray(function(error, films); 

导致错误

正确的语法应该是:

collection.find("_id":{$gt: 35}).  

双“”引号不应该在那里。

于 2016-01-26T20:15:58.010 回答