首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改列表中文档的顺序,MongoDB

如何更改列表中文档的顺序,MongoDB
EN

Stack Overflow用户
提问于 2020-03-27 18:05:21
回答 1查看 261关注 0票数 1

我有一个带有字段”的卡片列表,以保存新卡的索引,从1、2、3、4、5开始。

卡列表文档:

代码语言:javascript
运行
复制
{ "_id" : ObjectId("5e7e117de6f50cbda72ff41a"), "name" : "stark", "position" : 1,"idBoard":555 }
{ "_id" : ObjectId("5e7e117de6f50cbda72ff41b"), "name" : "sinatra", "position" : 2,"idBoard":555 }
{ "_id" : ObjectId("5e7e117de6f50cbda72ff41c"), "name" : "muzan  rusbé", "position" : 3,"idBoard":555 }
{ "_id" : ObjectId("5e7e117de6f50cbda72ff41d"), "name" : "shakira", "position" : 4,"idBoard":555 }
{ "_id" : ObjectId("5e7e117de6f50cbda72ff41e"), "name" : "john travolta", "position" : 5,"idBoard":555 }

我想在第5号位置加上位置1的名字斯塔克。

结果:

代码语言:javascript
运行
复制
sinatra - position 1,
muzan - position 2,
shakira - posiiton 3,
john travolta - position 4,
stark - position 5 (new position)

有办法这样做吗?这就像从X索引中移除一个值并将Z索引添加到数组中一样。我想改变每张卡的位置。

编辑:IdBoard 555是将每张卡保存到的董事会ID。Api /card/{Board ID 555}/用idBoard保存卡是555。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 19:05:06

如果您可以获得给定人员的当前位置,则可以在一次调用中完成rest更新:

步骤1 :获得球员当前位置

代码语言:javascript
运行
复制
db.getCollection('cards').findOne({name : 'stark', idBoard: 555}, {position :1, _id :0})

步骤2 :降低所有其他玩家在新位置上的位置,这个位置大于给定玩家的当前位置&小于或等于通过新位置。

代码语言:javascript
运行
复制
/** current position : 1, new position : 5 */
db.getCollection("cards").bulkWrite([
  {
    updateMany: { // This updateMany works if `currentPositionValue` < `newPositionValue`
      filter: {
        /** As many filters as possible in order to operate on less docs */
        idBoard: 555.0,
        name: { $ne: "stark" },
        $expr: { $and: [{ $gt: ["$position", 1] }, { $lte: ["$position", 5] }] }
      },
      update: [{ $set: { position: { $subtract: ["$position", 1] } } }]
    }
  },
  {
    updateOne: {
      filter: { name: "stark", idBoard: 555.0 },
      update: { $set: { position: 5 } }
    }
  }
]);

注:,我们通过idBoard: 555是为了避免文档的交叉匹配,Ex。:如果同一玩家stark存在于两个棋盘中,我们需要确定我们需要在哪个棋盘上更新位置。

更新:

您可能需要根据需要切换updateMany of .bulkWrite(),下面是您的currentPositionValue > newPositionValue

代码语言:javascript
运行
复制
/** current position : 4, new position : 1 */
{
    updateMany: {
      filter: {
        idBoard: 555.0, name : {$ne : 'john travolta'},
        $expr : {$and: [{ $gte: ["$position", 1] }, { $lt: ["$position", 4] }]}
      },
      update: [{ $set: { position: { $add: ["$position", 1] } } }]
    }
  }

因此,在这两个选项之间进行检查和切换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60891735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档