MongoDB 填充性能
MongoDB populate performance
最近问过这样的问题
Mongo 哪个更快:填充请求还是单独的异步请求?
示例
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
var FeedPostCommentSchema = new Schema({
feedPost: {type: Schema.Types.ObjectId, ref: 'FeedPost', index: true},
user: {type: Schema.Types.ObjectId, ref: 'User'},
comment: {
type: String,
trim: true
},
updated: {type: Date, default: Date.now},
created: {type: Date, default: Date.now, index: true}
});
mongoose.model('FeedPostComment', FeedPostCommentSchema);
显示所有评论时,我们还需要获取用户数据
我们可以使它成为标准填充方法:
FeedPostComment.find({feedPost: req.params.postId}).populate('user')
.skip(skip)
.limit(limit)
.sort({created: -1})
.lean()
.exec()
我们也可以使用并行查询来做到这一点:
FeedPostComment.find({feedPost: req.params.postId})
.skip(skip)
.limit(limit)
.sort({created: -1})
.lean()
.exec(function (err, comments) {
async.each(comments, function (comment, cb) {
User.findById(comment.user, function (err, composer) {
if (err) {
return cb(err);
}
comment.user = utils.getPublicDataOfUser(composer);
cb();
});
}, function (err) {
comments.reverse();
});
});
填充通常更快(也更有效),因为它使用单个 $in
查询来获取所有引用的文档,而不是一个一个地获取它们。
填充总是比正常的异步请求更快...但现在甚至比引入的速度更快,即 $lookup
和 pipeline
...您可能应该接受它。
最近问过这样的问题
Mongo 哪个更快:填充请求还是单独的异步请求?
示例
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
var FeedPostCommentSchema = new Schema({
feedPost: {type: Schema.Types.ObjectId, ref: 'FeedPost', index: true},
user: {type: Schema.Types.ObjectId, ref: 'User'},
comment: {
type: String,
trim: true
},
updated: {type: Date, default: Date.now},
created: {type: Date, default: Date.now, index: true}
});
mongoose.model('FeedPostComment', FeedPostCommentSchema);
显示所有评论时,我们还需要获取用户数据
我们可以使它成为标准填充方法:
FeedPostComment.find({feedPost: req.params.postId}).populate('user')
.skip(skip)
.limit(limit)
.sort({created: -1})
.lean()
.exec()
我们也可以使用并行查询来做到这一点:
FeedPostComment.find({feedPost: req.params.postId})
.skip(skip)
.limit(limit)
.sort({created: -1})
.lean()
.exec(function (err, comments) {
async.each(comments, function (comment, cb) {
User.findById(comment.user, function (err, composer) {
if (err) {
return cb(err);
}
comment.user = utils.getPublicDataOfUser(composer);
cb();
});
}, function (err) {
comments.reverse();
});
});
填充通常更快(也更有效),因为它使用单个 $in
查询来获取所有引用的文档,而不是一个一个地获取它们。
填充总是比正常的异步请求更快...但现在甚至比引入的速度更快,即 $lookup
和 pipeline
...您可能应该接受它。