【问题标题】:How can I re-order items in this array stored in Mongo?如何重新排序存储在 Mongo 中的这个数组中的项目?
【发布时间】:2019-01-06 20:03:26
【问题描述】:

我有一个存储在 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"
            }]

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

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

【问题讨论】:

    标签: javascript node.js mongodb algorithm sorting


    【解决方案1】:

    也许.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"
      });
    

    【讨论】:

      【解决方案2】:

      一旦您从用户那里获得了 ID, 我会做以下事情:

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

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

      【讨论】:

        【解决方案3】:

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

        一般来说,我建议获取整个文档并使用$set 覆盖整个值;在其他任何情况下,您都只能通过大量工作获得一点收获。

        【讨论】:

          猜你喜欢
          • 2011-11-25
          • 2012-01-08
          • 1970-01-01
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          • 2018-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多