如何重新排序此数组中存储在Mongo中的项目?

时间:2019-01-06 20:03:26

标签: javascript node.js mongodb algorithm sorting

我有一个存储在MongoDB中的数组,我按检索顺序显示并显示该数组,并让用户对其进行处理。这些项目可能完全相同,这意味着什么也没有更改,可以删除某些项目,甚至可能采用不同的顺序。

最后,当它提交给我时,我有一个可用的数组,该数组为我提供了所有ID的列表(mongo自动创建的ID)。如何根据我检索到的仅具有ID的数组重新排列存储在MongoDB中的数组。

如果要举个例子,它像这样存储在Mongo中

components: [
            {
                "_id": {
                    "$oid": "5c323c8123f8cb1d1034c16a"
                },
                "componentName": "Apple"
            },
            {
                "_id": {
                    "$oid": "5c324a1a79e775435c91a919"
                },
                "componentName": "Banana"
            },
            {
                "_id": {
                    "$oid": "5c324a8707eca920fc1d31bc"
                },
                "componentName": "Orange"
            },
            {
                "_id": {
                    "$oid": "5c324ace07eca920fc1d31bd"
                },
                "componentName": "Watermelon"
            }]

我得到的数组看起来像这样

["5c324a8707eca920fc1d31bc", "5c324a1a79e775435c91a919"]

意味着第一个和最后一个元素被删除,第二个和第三个元素被交换。所以我想在mongo中修改components数组,使它看起来像这样

components: [
            {
                "_id": {
                    "$oid": "5c324a8707eca920fc1d31bc"
                },
                "componentName": "Orange"
            },
            {
                "_id": {
                    "$oid": "5c324a1a79e775435c91a919"
                },
                "componentName": "Banana"
            }]

PS。如果您从未使用过MongoDB。只需使用components [1] .id即可访问MongoDB数组中的ID,该ID将为“ 5c323c8123f8cb1d1034c16a”

我真的想不出一种方法来正确地做到这一点,我想到的“ hacky”方法涉及更改一些我已经编写的代码,所以我想知道是否有一种方法可以实现此目标

3 个答案:

答案 0 :(得分:0)

也许.populate方法可以帮助您: https://mongoosejs.com/docs/populate.html#population

Story.
  findOne({ title: 'Casino Royale' }).
  populate('author').
  exec(function (err, story) {
    if (err) return handleError(err);
    console.log('The author is %s', story.author.name);
    // prints "The author is Ian Fleming"
  });

答案 1 :(得分:0)

从用户那里获得ID后, 我将执行以下操作:

  1. 通过ID获取数组中的对象。 参考:https://docs.mongodb.com/manual/tutorial/query-arrays/

  2. 使用新阵列更新旧阵列。 参考:https://docs.mongodb.com/manual/reference/method/db.collection.update/

答案 2 :(得分:0)

没有用于重新排序的特殊运算符(完整列表为here),但是您可以尝试优化操作数。例如,如果用户仅删除了几个索引,则$unset的速度将比覆盖速度快。如果发生简单的重新排序,请将$push$pull组合在一起(尽管这将需要两次调用,因为这两个运算符无法在一次更新中访问一个数组)。

通常,我建议获取整个文档并用$set覆盖整个值;在其他任何情况下,您只要付出大量的努力,就会收获很少。