从MongoDB中获取对象但限制从数组中提取的项目数

时间:2015-02-02 17:40:29

标签: javascript arrays node.js mongodb mongoose

我的API目前有一条基于event_id从我的MongoDB数据库获取事件的路线。这很好用。但是,我有一张照片'此事件对象中的数组正在增长(当前此数组中超过3,000个对象)。 我想传递limit参数来限制从此数组中提取的结果数,但无法弄清楚如何。下面是我当前的节点路由和mongoDB架构:

路线:

// get event by _id
app.get('/api/events/:event_id', function(req, res) {

    // use mongoose to get event
    Event.findOne({object_id: req.params.event_id}, function(err, event) {

        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        if (req.params.limit >= 0) {
            // res.jsonp(event) with photos array limited to req.params.limit
        }

        res.jsonp(event); // return event in JSON format
    });
});

模式:

var eventSchema = new Schema({
event: String,
city: String,
state: String,
date: String,
start: String,
end: String,
dateState: String,
radius: String,
team_1: String,
team_2: String,
object_id: String,
longitude: String,
latitude: String,
cover: {
    img: String,
    username: String
},
photos: []

})

2 个答案:

答案 0 :(得分:0)

Event.findOne({object_id: req.params.event_id})
    .limit(10)
    .exec(function(e,doc){
        ...
});

修改

或者,如果您已对照片进行了参考...您可以使用limit选项填充引用ID的doc数组。希望它有帮助:) All abount population

.find(...)
.populate({
     path: 'photos',
     options: { limit: 5 }
})
.exec(...)

模式

var eventSchema = new Schema({
event: String,
city: String,
state: String,
...
photos: [{ type:String, ref:'pictureSchema' }]
}

var pictureSchema = new Schema({
name : {type:String},
url : {type:String},
...
}

在照片阵列中,你只需要放置图片文档的id,当你填充照片数组时,它会将pictureSceham doc放在_id中。

答案 1 :(得分:0)

不要有不断增长的阵列领域。它对性能不利,因为MongoDB(如果< = 2.6 /使用mmap)将在文档在存储引擎为其分配的空间之外增长时移动文档,从而导致性能问题。你应该改变你的模式以避免像这样的数组,但我不能真正说出你应该怎么做,因为我不太了解你的用例。

有一种方法可以使用$slice projection来限制查找查询中返回的数组元素的数量。

> db.test.drop()
> db.test.insert({ "_id" : 0, "x" : [0, 1, 2, 3, 4] })
> db.test.find({ "_id" : 0 }, { "x" : { "$slice" : 2 } })
{ "_id" : 0, "x" : [0, 1] }