我的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: []
})
答案 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] }