使用猫鼬,如果我有Note模型,则可以使用find函数上的查询选项检索分页和排序的结果,就像这样...

   Note.find({ creator: creatorId})
        .select('text')
        .limit(perPage)
        .skip(perPage * page)
        .sort({
            name: 'asc'
        })
        .exec(function(err, notes) {
            Note.count().exec(function(err, count) {
                res.render('notes', {
                    notes: notes,
                    page: page,
                    pages: count / perPage
                })
            })
        });


如果将Note模式嵌入到父文档(notesContainerSchema)中,是否可以实现相同的功能(筛选,选择,限制,跳过,排序等),如下所示:

var noteSchema = new Schema({
  creator: { type: String },
  text: { type: String }
});

var notesContainerSchema = new Schema({
  key: { type: String, unique: true },
  notes: [ noteSchema ] // note schema is now an array of embedded docs
});

var NotesContainer = db.model('notesContainer', notesContainerSchema);

最佳答案

您可以将aggregation与结合使用:


一个$project阶段到$filter notes数组,其中包含creatorId$slice
$unwind阶段以展开notes数组
一个$sort的名字
$project仅选择text字段


在nodeJS中,使用mongoose:

NotesContainer.aggregate([{
    $project: {
        notes: {
            $slice: [{
                "$filter": {
                    "input": "$notes",
                    "as": "item",
                    "cond": { "$eq": ["$$item.creator", creatorId] }
                }
            }, (perPage * page), perPage]
        }
    }
}, {
    $unwind: "$notes"
}, {
    $sort: {
        "notes.name": 1
    }
}, {
    $project: {
        "text": "$notes.text",
        "_id": 0
    }
}]).exec(function(err, notes) {
    console.log(notes);
});

关于node.js - 从Mongoose中的嵌入式文档中检索分页结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44597428/

10-12 03:24