【问题标题】:Manipulating the order of elements in an array of references in MongoDB在 MongoDB 中操作引用数组中元素的顺序
【发布时间】:2016-02-12 23:11:23
【问题描述】:

我正在实现一个相册,并希望有一个优雅的解决方案来存储其图像的顺序。 Album 模型包含对图像的引用数组,如下所示:

// Example album
{
    _id: 12345
    images: [ObjectId(1), ObjectId(2), ObjectId(3)]
}

// Example image
{
    _id: 1
    title: My Picture
    author: Me
}

我试图弄清楚如何处理数据库中的订单更新。例如,假设我想从以下位置更新图像数组:

[ObjectId(1), ObjectId(2), ObjectId(3)]

[ObjectId(3), ObjectId(1), ObjectId(2)]

我想知道 1) 我是否可以通过更新直接重新组织引用数组,或者 2) 如果可以,我如何才能实际访问数组中的每个元素以指示新顺序。

实际上,这种解决方案可能毫无用处,因为数组可以异步填充。另一种解决方案是完全忽略我的要求,并单独存储每个图像的顺序,如下所示:

// Image
{
    _id: 1
    title: My Picture
    author: Me
    position: 2    // like this
}

这样,当我异步拉下一组图像时,我所要做的就是按每个图像的position 字段排序。

此策略的一个缺点是,随着图像数量变得足够大,重新排序将变得非常昂贵。将 100 长度数组的最后一个元素移到最开始需要我更新数据库中每个图像的位置值。

如果您有任何建议,请告诉我!

【问题讨论】:

    标签: javascript arrays mongodb sorting database


    【解决方案1】:

    数组中元素的顺序保持不变。

    要更改顺序,请使用您喜欢的顺序更新数组。例如:

    db.album.update({_id:1}, {$set:{images:[ObjectId(3), ObjectId(1), ObjectId(2)]}});
    

    【讨论】:

    • 很高兴知道,但是当我填充这些引用时,顺序会保留吗?假设填充方法异步发生
    • 不确定 populate 在这种情况下的含义,但任何文档更新都是原子的。如果您担心与同时更新发生冲突,则需要对文档实施增量版本控制。
    • 所以在将图像数组简单地作为参考发送给客户端之前,我想先populate他们每个图像的数据。我不确定这种填充是否异步发生以及图像的顺序是否变得随机。
    • 我意识到此时我在问一个新问题:我是否可以按照它们的存储顺序填充和传递引用数组给客户端。这不公平,因为您非常有帮助地回答了我最初的问题,即是否可以更改数组中引用的顺序。已接受答案!
    • 坦率地说,我会编写一个简单的测试来确认订单是否保留,而不是依赖网络上的答案。它更快、更可靠,并保证在升级其中一个组件后它不会默默地倒退。
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多