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年,本年度.
我猜投影是我需要的,但问题是投影只返回它找到的第一个结果......
首先,投影不会返回它发现的第一个结果,它告诉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/