从MongoDB的二维数组中删除一个元素。

4

我想从我的mongoDB集合中删除一个二维数组。我的模式看起来像:

{
    "_id" : ObjectId("6218e63e4f9e4efbb05de2bf"),
    "name" : "Toyota",
    "rate" : 50,
    "fine" : 5,
    "datesBooked" : [ 
        [ 
            "2022-02-08", 
            "2022-02-14"
        ], 
        [ 
            "2022-02-16", 
            "2022-02-18"
        ], 
        [ 
            "2022-02-20", 
            "2022-02-22"
        ], 
        [ 
            "2022-02-24", 
            "2022-02-25"
        ], 
        [ 
            "2022-03-01", 
            "2022-03-02"
        ], 
        [ 
            "2022-03-01", 
            "2022-03-02"
        ]
    ],
    "__v" : 0
}

我想找到一个特定 _id 的对象,并从 datesBooked 二维数组中删除特定元素。我尝试使用 $pull 函数,但我做不对。请问有人能告诉我应该如何操作吗!我正在使用 express 和 javascript 完成这个操作。还有,我是新手。 非常感谢!

2个回答

1

以下是使用$pull从datesBooked数组中的第二个数组中删除特定元素的方法:

 var myVariable="2022-02-14"
 db.collection.update({ "_id": ObjectId("6218e63e4f9e4efbb05de2bf") },
  {
   "$pull": {
     "datesBooked.$[]": myVariable
   }
 })

解释: 您需要使用$[](自mongodb v3.6起可用的所有位置运算符)来提供第二个数组以进行$pull操作,以便删除具有精确值的数组元素,在本示例中,该值为“2022-02-14”。
游乐场
如果您需要从第一个数组中删除[var1,var2]元素,则需要像这样使用$pull:
 db.collection.update({
  "_id": ObjectId("6218e63e4f9e4efbb05de2bf")
  },
 {
 "$pull": {
  "datesBooked": [
   "2022-02-08",
   "2022-02-14"
  ]
 }
})

解释:从第一个数组中提取数组元素。 演示

嗨!我能把“datesBooked.$[]”等同于一个变量吗?像这样:“datesBooked.$[]”:变量。现在它正在与常数“2022-02-14”进行比较。我想将其与一个变量进行比较。很抱歉问这样一个初学者的问题,但我无法做到 :( - Amijeet Thakur
当然可以比较变量,你可以在JavaScript中用你的变量替换...我已经更新了我的答案,加入了变量。 - R2D2
这只会移除2D数组中的一个元素,对吧?我该如何移除数组的两个元素呢?我想要从2D数组中移除整个数组,其值为[var1,var2]。无法执行此操作“datesBooked.$[]”:[myVariable1,myVariable2]。 - Amijeet Thakur
1
我的答案已经更新,包括你的第二个选项... - R2D2

0
在MongoDB v4.2+中,您可以使用管道更新来实现此目的,如下所示:
db.collection.updateOne(
{ _id: id },
[
  {
    $set: {
      datesBooked: {
        $concatArrays: [
          {
            $slice: [
              "$datesBooked",
              index
            ]
          },
          {
            $slice: [
              "$datesBooked",
              index + 1,
              {
                $size: "$datesBooked"
              }
            ]
          }
        ]
      }
    }
  }
])

Mongo Playground

对于旧版本,无法在一个调用中完成此操作,您需要将其拆分为 2 个单独的调用。

-------------------------- 编辑 ------------------------------- 以下是如何使用变量进行操作的:

const var1 = "2022-02-20";
const var2 = "2022-02-22";

db.collection.updateOne(
{ _id: id },
[
  {
    $set: {
      datesBooked: {
        $filter: {
          input: "$datesBooked",
          cond: {
            $and: [
              {
                $ne: [
                  {
                    $arrayElemAt: [
                      "$$this",
                      0
                    ]
                  },
                  var1
                ]
              },
              {
                $ne: [
                  {
                    $arrayElemAt: [
                      "$$this",
                      1
                    ]
                  },
                  var2
                ]
              }
            ]
          }
        }
      }
    }
  }
])

Mongo Playground


嗨Tom,非常感谢你的帮助,但我是否可以通过将要删除的数组元素与变量进行比较,然后删除数组元素来实现这一点。我不想针对特定索引执行此操作,而是进行比较,如果匹配我想要删除的元素,则只删除它? - Amijeet Thakur
当然可以做到,你想根据什么条件进行指定吗? - Tom Slabbaert
我想要删除它,只有当datesBooked [i] [0] == variable1 && datesBooked [i] [1] == variable2时。 - Amijeet Thakur
我编辑了如何实现它,实际上你可以用几种不同的方法来实现。我展示了如何使用 $filter 的流水线更新功能。 - Tom Slabbaert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接