猫鼬 ODM:如何从嵌入文档数组中获取前一个和后五个元素?

Mongoose ODM: how to get first one and last five elements from array of embedded documents?

提问人:Anton Melnikov 提问时间:9/4/2013 最后编辑:Anton Melnikov 更新时间:6/20/2014 访问量:1259

问:

我正在使用 NodeJS/Express/MongoDB 编写一个简单的论坛引擎,并且我对 Mongo 的 Mongoose ODM 有点问题。

我有像这样的板、螺纹和柱子模型(稍微简化一下):

var boardSchema = mongoose.Schema({
    _id: ObjectId,
});


var threadSchema = mongoose.Schema({
    _id: ObjectId,
    board: {type: ObjectId, ref: 'Board', index: true},
    posts: [postSchema],
});


var postSchema = mongoose.Schema({
    _id: ObjectId,
    thread: {type: ObjectId, ref: 'Thread'},
});

因此,帖子被嵌入到线程文档中。我想显示一个带有一些帖子的线程列表:第一个帖子和五个最新的帖子。是否可以在一次查询中实现这一点?我可以使用 slice 函数获得第一个最新的五个,但我想要比两个几乎相同的查询更优雅的东西。这是我目前的查询:

threadModel
    .find(
        {board: boardId, is_deleted: false}, 
        {posts: {$slice: -5}}
    )
    .sort({last_updated: 1, is_sticky: 1})
    .skip(settings.threadsOnPage * parseInt(pagePointer, 10))
    .limit(settings.threadsOnPage)
    .populate('board')
    .exec(function(err, threads){
        if (err) return callback(err);
        if (threads === []) return callback(404);
        callback(null, threads);
    });
node.js mongodb 猫鼬

评论

0赞 Asya Kamsky 9/4/2013
既然你总是想要第一篇文章,你有没有考虑过将其从数组中解出并将其存储在它自己的字段中?它将永远存在,并且您“特别”对待它,因此它是一个很好的候选者。
0赞 Anton Melnikov 9/4/2013
谢谢,这可能是一个解决方案。我是NoSQL数据库的新手,所以我仍然尽量避免重复,也许这不是那里的工作方式。实际上,昨天我尝试在线程模型中填充一个字段,但无法让它工作 - 该字段始终具有 null 值。

答: 暂无答案