本文还是要从删除操作的语法说起。
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时,字符序的引入,对删除数据的结果产生了影响。