我有一个带有字段“”的卡片列表,以保存新卡的索引,从1、2、3、4、5开始。
卡列表文档:
{ "_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的名字斯塔克。
结果:
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。
发布于 2020-03-27 19:05:06
如果您可以获得给定人员的当前位置,则可以在一次调用中完成rest更新:
步骤1 :获得球员当前位置
db.getCollection('cards').findOne({name : 'stark', idBoard: 555}, {position :1, _id :0})步骤2 :降低所有其他玩家在新位置上的位置,这个位置大于给定玩家的当前位置&小于或等于通过新位置。
/** 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
/** 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] } } }]
}
}因此,在这两个选项之间进行检查和切换。
https://stackoverflow.com/questions/60891735
复制相似问题