MongoDB查询标准和预测

And*_*man 2 mongodb node.js express mongoskin

我正在使用Node/Express/MongoDB/Mongoskin构建应用程序.

我在数据库中有一个集合namned"clients",其中包含有关客户帐户信息的文档.每个客户端文档都包含一个包含invoice-objects的数组,如下所示:

doc.invoices = [
  {year: 2012,
  quarter: 1, 
  daily: 912.00, 
  sms: 42.00, 
  paid: true},

  {year: 2012,
  quarter: 2, 
  daily: 913.00, 
  sms: 55.00, 
  paid: true}, 

  {year: 2012,
  quarter: 3, 
  daily: 876.00, 
  sms: 82.00, 
  paid: true}, 

  {year: 2012,
  quarter: 4, 
  daily: 903.00, 
  sms: 93.00, 
  paid: false},

  {year: 2013,
  quarter: 1, 
  daily: 915.00, 
  sms: 67.00, 
  paid: true},

  {year: 2013,
  quarter: 2, 
  daily: 920.00, 
  sms: 35.00, 
  paid: true}, 

  {year: 2013,
  quarter: 3, 
  daily: 880.00, 
  sms: 92.00, 
  paid: true}, 

  {year: 2013,
  quarter: 4, 
  daily: 900.00, 
  sms: 85.00, 
  paid: false}
]
Run Code Online (Sandbox Code Playgroud)

问题:假设我想查询此集合中的所有文档,例如显示所有客户端的Superadmin视图,但我想将发票数组返回的信息限制为"年"等于某个值的对象,例如,2013年,本年度.

我猜投影是我需要的,但问题是投影只返回它找到的第一个结果......

urf*_*rfx 6

首先,投影不会返回它发现的第一个结果,它告诉mongo返回什么.

.findOne(查询)将LIMIT结果发送到一个或查找(查询).limit(1)也会做同样的事情.

你说你想要"全部"获取你的数据.

一个标准的查找类型查询将启动你的...

find({mongo:query},{mongo:projection})
Run Code Online (Sandbox Code Playgroud)

但是将结果限制为来自mongo shell的游标*

因为你说你使用express.js你可以使用一个javascript函数来"返回所有"这样的简单查找结果...

db.sales.find({"year":2013},{_id:0,"year":1,"quarter":1,"daily":1,"sms":1,"paid":1}) 
Run Code Online (Sandbox Code Playgroud)

首先设置一个功能的路由

app.get('/sales/yr/:yr', sales.getAllResults);
Run Code Online (Sandbox Code Playgroud)

然后是一个处理简单的mongo查询和投影的函数.

/**
 *  get ALL results given YEAR ONLY
 *  extend jsonQuery to modify results
 *  extend or reduce jsonProjection to control data returned
 */
exports.getAllResults= function(req, res) {
    var yr = req.params.yr ;    
    var jsonQuery = {"year":yr} ;  //add or remove comma seperated "key":values given your JSON collection
    var jsonProjection = {_id:0,"year":1,"quarter":1,"daily":1,"sms":1,"paid":1} ; //leave year out since that's specified in the query anyhow
    var jsort = {"some-thing-else":-1} ; //-1 descending or 1 ascending
    db.collection("YOUR-COLLECTION_NAME", function(err, collection) {
        collection.find( jsonQuery, jsonProjection).sort(jsort).toArray( function(err, items) {
            res.send(items);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

最后你可能想要关注express和mongo的教程有一些好的,我把这个答案放在一起,基于Chris Coenraets的一个优秀的首发看到: -

http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/

  • 使用标准的mongo查询shell,默认情况下,您只能使用分页结果集,其中键入"it"将遍历结果.