如何用MongoDB改变数组的顺序?

时间:2016-03-05 06:32:24

标签: javascript node.js mongodb express mongoose

我需要能够在MongoDB对象中递增和递减数组元素的位置。

我查看了MongoDB API中的<update> API,但找不到任何让我这样做的内容。

我正在尝试使用findOneAndUpdateMongoose,我知道我试图向上或向下移动的元素的索引。

base64编码图像的数组项示例:

{ 
  images: [
    "img1",
    "img2",
    "img3"
  ]
}

我想移动,例如&#34; img2&#34;,向上或向下(但&#34;图像&#34;因为无处可去,所以不应该推高)。 / p>

如果我想推动&#34; img2&#34;然后结果将是:

{ 
  images: [
    "img2",
    "img1",
    "img3"
  ]
}

如果我通过更改索引,交换或向上/向下推动来实现这一点并不重要。

1 个答案:

答案 0 :(得分:4)

就像@ 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的顺序,删除或替换图像等来更新整个集合。