简体   繁体   中英

Dynamic queries in MongoDB and Node.js

I am working on a nodejs/express app with Mongodb on the backend. In one of my API calls, depending on the presence of a particular querystring parameter or the other I want to issue a query to Mongodb with either a $gt or a $lt.

In some cases we want to ask for everything less than the tokenId using $lt, but in other cases we want everything greater than the tokenId using $gt. How do we do that without duplicating the queries?

Here's an example query:

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

Is there a way to dynamically create the query without actually doing 2 different queries?

Build up your query object programmatically:

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);

Update

Now that Node.js 4+ supports computed property names , you can create query in one step as:

var query = {
    film_id: {$in: genre},
    _id: {[param ? '$lt' : '$gt']: tokenId}
};

The Above code may not work. The above dynamic query will be resolved to following Ex. Token is an integer 35.

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

resulting in Error

The correct syntax should be:

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

The double "" quotes should not be there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM