【问题标题】:MongoDb subdocument array populate (via Mongoose ORM) : Does it maintain array order when populate is calledMongoDb 子文档数组填充(通过 Mongoose ORM):调用填充时是否保持数组顺序
【发布时间】:2015-11-28 08:41:16
【问题描述】:

假设我在 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);
        });
    }
});

数组中元素的顺序会保持不变吗?这里的目标是允许用户维护他们电影的播放列表顺序。如果在“填充”方法触发时,电影对象 ID 的数组顺序没有得到维护,那么这将不符合我的目的。因此,我想我会问在这方面知识更丰富的人。

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

提前感谢您的帮助。

【问题讨论】:

    标签: arrays mongodb mongoose subdocument mongoose-populate


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。问题是 - 猫鼬填充方法是否保持原始数组顺序。但是,我与一位朋友核对过——他给了我这个指向猫鼬填充代码的链接。 github.com/Automattic/mongoose/blob/master/lib/model.js#L2342 。他还给了我一个堆栈溢出的链接—— $in 不保证数组元素的顺序——stackoverflow.com/questions/22797768/…。但是,阅读 github 源页面上的代码 - 我可以看到维护项目顺序的提示 - 请参阅第 2298 到 2317 行。有人可以验证
    猜你喜欢
    • 2017-03-21
    • 2017-06-06
    • 2020-12-18
    • 1970-01-01
    • 2017-09-25
    • 2020-11-21
    • 2019-01-31
    • 2019-07-28
    • 2014-12-05
    相关资源
    最近更新 更多