Mongodb删除操作中字符序对结果的影响

发布时间:2024年01月07日

本文还是要从删除操作的语法说起。

db.collection.deleteMany(
  <filter>,
  {
    writeConcern: <document>,
    collation: <document>,
    hint: <document|string>
  }
)

删除语法中,可以指定数据写入策略,字符序和使用的索引字段。

字符序,引发了一些思考。记得在研究视图的时候,使用到了字符序。当时构建了下面的集合

db.places.insertMany([
    { _id: 1, category: "café", status: "A" },
    { _id: 2, category: "cafe", status: "a" },
    { _id: 3, category: "cafE", status: "a" }
    ])

当指定使用法语字符序时,在构建的视图中计算返回文档时结果时3

db.placesView.countDocuments({ category: "cafe"})

构建视图和介绍可参考前面的视图介绍文章Mongodb创建和查询视图(二)

既然使用查询条件{ category: "cafe"}返回3个结果,那在deleteOne(), deleteMany()方法中指定字符序,会删除多少条数据,删除1条,还是3条。很有意思和值得探讨的问题。

首先执行deleteOne(),看到只删除了一条数据。按照数据库插入顺序,删除了最早插入数据库的数据。在insertMany()方法中,默认按照数组中的排列顺序插入数据,所以会删除_id为1的数据。

db.places.deleteOne({category: "cafe"}, {collation: { locale: "fr", strength: 1 } })

{
	"acknowledged" : true,
	"deletedCount" : 1
}

查询结果集,只有_id为2和3的数据了。

这里可以得出结论,使用deleteOne, 无论是否指定字符序,都只删除一条数据。

接下来,重新构建集合,来测试deleteMany()方法。

db.places.drop()
db.places.insertMany([
    { _id: 1, category: "café", status: "A" },
    { _id: 2, category: "cafe", status: "a" },
    { _id: 3, category: "cafE", status: "a" }
    ])

首先执行deleteMany()方法,不带有collation,只能够删除满足查询条件的数据,删除了_id为2的数据。

db.places.deleteMany({category: "cafe"})
{
	"acknowledged" : true,
	"deletedCount" : 1
}

使用find查询,能够查出其他两条数据

再次重新构建集合

db.places.drop()
db.places.insertMany([
    { _id: 1, category: "café", status: "A" },
    { _id: 2, category: "cafe", status: "a" },
    { _id: 3, category: "cafE", status: "a" }
    ])

这次执行带有collation的deleteMany()方法。返回结果中,删除了3条数据。

db.places.deleteMany({category: "cafe"}, {collation: { locale: "fr", strength: 1 } })
{
	"acknowledged" : true,
	"deletedCount" : 3
}

由此可见,当指定字符序collation时,字符序的引入,对删除数据的结果产生了影响。

文章来源:https://blog.csdn.net/wilsonzane/article/details/135435445
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。