如何使用 MongoDB 更改数组的顺序?
Posted
技术标签:
【中文标题】如何使用 MongoDB 更改数组的顺序?【英文标题】:How to change order of array with MongoDB? 【发布时间】:2016-06-19 01:37:38 【问题描述】:我需要能够增加和减少 MongoDB
对象中数组元素的位置。
我查看了MongoDB API 中的<update>
API,但找不到任何可以让我这样做的东西。
我正在尝试使用findOneAndUpdate
到Mongoose
,并且我知道我要向上或向下移动的元素的索引。
base64
编码图像的数组项示例:
images: [
"img1",
"img2",
"img3"
]
我想向上或向下移动,例如“img2”(但“image”应该无法向上推,因为无处可去)。
如果我想将“img2”向上推,那么结果将是:
images: [
"img2",
"img1",
"img3"
]
我是否通过更改索引、交换或上推/下推来实现这一点并不重要。
【问题讨论】:
抱歉,您的问题非常不清楚,可以通过多种不同的方式进行解释。您应该展示一个示例文档以及您希望从更新中获得的结果。 感谢您的反馈,我更新了我的问题。如果我可以进一步澄清,请告诉我。 编写“抽象案例”的问题在于,适合该案例的答案几乎从不适用于您试图代表并最终解决的现实世界场景。我会展示你的真实数据,或者至少与真实数据一样接近。您的base64
图像不太可能像["img1", "img2", "img3]
一样简单,当然是复杂的编码字符串。因此,重要的是人们要知道这是否只是直接在每个数组索引中的普通“base64”数据,或者它是否驻留在另一个文档中,带有一些标识符或键。
我同意!但是,在这种情况下,它实际上只是一个字符串,就像在抽象情况下一样。如果我输入真实数据,它会占用太多页面而无法使用。
***.com/questions/872310/…
【参考方案1】:
就像@blakes-seven 所说,你有两种方法可以做到:
抓取、更新和推送
db.images.find( _id: '' , images : 1 )
.then(function(img)
var tmpImg = img.images[0];
img.images[0] = img.images[1];
img.images[1] = tmpImg;
db.images.update( _id: img._id , $set: images: img.images );
)
直接更新(如果您在客户端有图像并且知道索引),使用 $position
db.images.update( _id: '' , $push: images: $each: ['img2'] , $position: 0 )
.then(function()
db.images.update( _id: '' , $unset: 'images.2': 1)
);
https://docs.mongodb.org/manual/reference/operator/update/position/
但是,我认为您应该重新设计存储图像的方式,例如使用虚拟排序:
images: [
base64: 'img1', order: 0, _id: 'img1' ,
base64: 'img2', order: 1, _id: 'img2' ,
base64: 'img3', order: 2, _id: 'img3'
]
这样,您可以使用虚拟订单索引对图像进行排序,仅使用 _id 更新它们,或者通过更改所有 img2 的顺序、删除或替换图像等来更新整个集合。
【讨论】:
我考虑过采用您的方法向数据库对象添加索引,但我是否也不必更新其他图像顺序索引,所以它在很大程度上是一样的吗? 是的,您必须第一次更新现有文档才能拥有一个统一的数据库,其余的我不知道您的实现以及您如何使用图像,所以这是您的电话它只是一个建议:D 我的意思是即使在第一次之后,如果我想更改单个项目的订单,我仍然需要修改其他订单ID。我没有看到在这种情况下这对我有什么好处,因为无论如何我都在修改整个对象。有没有一种简单的方法可以修改我缺少的所有订单 ID? 是的,但是您不必将整个图像数组发送到数据库或要为其更新其索引的图像,因此您可以节省大量带宽并获得更好的性能以上是关于如何使用 MongoDB 更改数组的顺序?的主要内容,如果未能解决你的问题,请参考以下文章