簡體   English   中英

在NodeJS中動態構建MongoDB查詢

[英]Dynamically building MongoDB queries in NodeJS

我收到一個看起來像這樣的POST參數:

sort:
    [ 
        { field: 'name', dir: 'asc', compare: '' },
        { field: 'org', dir: 'asc', compare: '' }
    ] 
}

我需要根據它創建一個MongoDB查詢,所以看起來應該是這樣的:

db.collection("my_collection").find( ... ).sort({'name': 'asc', 'org': 'asc'}).toArray(...);

無論如何,請記住可以傳遞更多字段。 此外,可能會發生這些字段都沒有傳遞,這意味着查詢不會有.sort()

我的問題:如何使用Node的MongoDB驅動程序動態創建查詢? 是否有查詢構建器或類似的東西?

我發現大多數情況對於傳遞的數據都是唯一的,因此構建查詢對象因項目而異。
所以最初的想法是為express(在我的例子中)創建中間件,它將查詢參數解析為對查詢有效的對象。

mongo-native可以用作游標的鏈接選項,也可以用作對象:

鏈接:

items.find({ type: 'location' }).sort({ title: 1 }).limit(42).toArray(function(err, data) {
  // ...
});

非鏈接:

items.find({ type: 'location' }, { sort: { title: 1 }, limit: 42 }).toArray(function(err, data) {
  // ...
});

正如您所看到的,Non-Chained可以接受所有內容作為對象,而chained會在每個方法之后返回游標,並且可以重復使用。 所以通常你有兩個選擇:

對於鏈式:

var cursor = items.find({ type: 'location' });
if (sort) {
  cursor.sort(sort);
}
cursor.toArray(function(err, data) {
  // ...
});

對於非鏈式:

var options = { };
if (sort) {
  options.sort = sort;
}
items.find({ type: 'location' }, options).toArray(function(err, data) {
  // ...
});

重要的是要記住,必須正確驗證和解析來自查詢的任何數據。 如果你正在開發API(例如),並且決定改變傳遞排序參數的方式或者想要添加新方法,那么制作中間件(在express.js中)來解析這些數據 - 是要走的路。

分頁示例:

function pagination(options) {
  return function(req, res, next) {
    var limit = options.limit ? options.limit : 0;
    var skip = 0;

    if (req.query.limit) {
      var tmp = parseInt(req.query.limit);
      if (tmp != NaN) {
        limit = tmp;
      }
    }
    if (req.query.skip) {
      var tmp = parseInt(req.query.skip);
      if (tmp != NaN && tmp > 0) {
        skip = tmp;
      }
    }

    if (options.max) {
      limit = Math.min(limit, options.max);
    }
    if (options.min) {
      limit = Math.max(limit, options.min);
    }

    req.pagination = {
      limit: limit,
      skip: skip
    };
    next();
  }
}

用法:

app.get('/items', pagination({
  limit: 8, // by default will return up to 8 items
  min: 1, // minimum 1
  max: 64 // maximum 64
}), function(req, res, next) {
  var options = {
    limit: req.pagination.limit,
    skip: req.pagination.limit
  };
  items.find({ }, options).toArray(function(err, data) {
    if (!err) {
      res.json(data);
    } else {
      next(err);
    }
  });
});

和網址示例:

http://example.com/items  
http://example.com/items?skip=64  
http://example.com/items?skip=256&limit=32  

因此,它是開發靈活的框架的方法,它不會創建任何事物必須編碼的規則以及解決您的挑戰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM