我有一个Collection ,其 struct 如下:

{
    "_id" : ObjectId("62e25c91dab0625cc8604198"),
    "sources" : [
        {
            "createDate" : ISODate("2022-07-25T17:16:12.407+02:00"),
            "type" : "name1"
        },
        {
            "createDate" : ISODate("2022-07-25T17:16:12.407+02:00"),
            "type" : "name2"
        }
    ]
}

我想删除所有带有"type":"name2"的项目.

以下语句似乎找到了该项目,但并未将其删除:

db.collection.update({} ,{  $pull: { "sources" : { $elemMatch: { "type":"name2"}}}})

注意:我想删除所有匹配的项目.

推荐答案

$pull docs个数字表明,这里不需要$elemMatch(重点补充说,这确实适得其反):

$pull运算符将每个元素视为顶级对象.该查询将应用于每个元素.该表达式不需要使用$elemMatch来指定匹配条件.

相反,下面的操作does not $pull将原始集合中的任何元素

db.survey.updateMany(
 { },
 { $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } }
)

同一文档页面的顶部以以下内容开头(再次强调):

$pull运算符从现有数组all instances中删除与指定条件匹配的一个或多个值.

以下命令似乎适用于您的示例文档:

db.collection.update({},
{
  $pull: {
    "sources": {
      "type": "name2"
    }
  }
})

Playground demonstration here.

两个相关的侧面:

  • 当只有一个查询条件时,通常不需要$elemMatch(见here).
  • 当使用较旧的update()命令/语法(与较新的updateOne()updateMany()相反)时,您可能需要像第三个参数一样在选项中指定multi: true,以便修改多个文档.

Mongodb相关问答推荐

查找/查找单个深度嵌套文档的多个集合

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

MongoDB聚合如何对对象数组中的值求和

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

Mongoose updateMany 以及 Where 和 orWhere?

如何使用指南针连接到 mongodb replicaset (k8s)

有没有办法在 Prisma for MongoDB 的模式中显式声明 int32?

Nestjs中不同语言数据的mongodb聚合代码

为什么使用整数作为 pymongo 的键不起作用?

MongoDB获取聚合查询的executionStats

如何使用sailsjs v0.10连接mongodb?

如何更新 mongodb 文档以向数组添加新元素?

python mongodb正则表达式:忽略大小写

MongoDB:自动生成的 ID 为零

带有排序功能的mongoose findOne

Golang + MongoDB 嵌入类型(将一个 struct 嵌入到另一个 struct 中)

如何在 Rails 中混合使用 mongodb 和传统数据库?

MongoDB 在 mongoengine 中使用 OR 子句

MongoDB MapReduce - 发出一个键/一个值不调用reduce

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小