MongoDb子文档数组填充(通过Mongoose ORM):调用populate时是否保持数组顺序

时间:2015-09-02 17:49:42

标签: arrays mongodb mongoose subdocument mongoose-populate

假设我在Mongoose中有2个Schema,它们看起来像这样:

var movieSchema = mongoose.Schema({
    name: String,
    type: String
});

var moviePlaylistSchema = mongoose.Schema({
    name: String,
    movies: [{type: mongoose.Schema.Types.ObjectId, ref: 'Movie'}]

});

var Movie = mongoose.model('Movie', movieSchema);
var MoviePlaylist = mongoose.model('MoviePlaylist', moviePlaylistSchema);

如果按以下方式进行查询:

MoviePlaylist.find({}).populate('movies').exec(function(err, res) {
    if (err) console.log('err', err);
    else {
        console.log('res', res);
        res.forEach(function(elem, index) {
            console.log('elem.name', elem.name);
        });
    }
});

是否可以维护数组中元素的顺序?这里的目标是允许用户维护他们的电影的播放列表顺序。如果,当"填充"方法触发,不保持Movie对象ID的数组顺序,那么这不符合我的目的。因此,我想问一下在这方面知识渊博的人。

如果这样可行,那么我还有另一个任务允许用户改变播放列表中电影的顺序,这应该是直接的,允许在数组中交换电影对象id索引。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

MongoDB将保持数组的顺序,就像任何编程语言中的数组一样。

您可以查看here规范以供参考,该规范强调数组必须包含键的整数值,并按数字升序维护。

此外,数组上的Mongoose populate通过Model.populate在数组的每个元素上调用forEach来工作。这会修改数组,因此保留了顺序。您可以看到相关的源代码JSFiddle