操纵MongoDB中引用数组中元素的顺序
问题描述:
我正在实现一个图像相册,并希望存储图像顺序的优雅解决方案。相册模型保存一个引用图像如下:操纵MongoDB中引用数组中元素的顺序
// 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长度数组的最后一个元素移动到最开始将需要更新数据库中每个图像的位置值。
如果您有任何建议,请让我知道!
答
数组中元素的顺序与保持相同。
要更改顺序,请按照您喜欢的顺序更新阵列。例如:
db.album.update({_id:1}, {$set:{images:[ObjectId(3), ObjectId(1), ObjectId(2)]}});
这很好知道,但是当我_populate_那些引用时会保留这个顺序吗?假设填充方法异步发生 – robinnnnn
不确定在此上下文中*填充*的含义,但任何文档更新都是原子的。如果担心与同时更新发生冲突,则需要实现文档的增量版本控制。 –
因此,在将图像数组简单地作为参考发送给客户端之前,我想首先使用每个图像的数据[填充](http://mongoosejs.com/docs/populate.html)。我不确定这个人群是否异步发生,图像的顺序是否随机化。 – robinnnnn