MongoDB Scala-删除集合中的重复文档
如果我想使用Scala删除MongoDB集合中的重复文档,应该怎么做 非常确定它很简单,但我总是在Mongo Shell中找到方法来实现它。使用 在本例中,我将使用Scala 2.11的版本2.1.0 我想您希望删除除_id字段外具有相同重复属性的所有文档 我在一个用户集合中有四个文档MongoDB Scala-删除集合中的重复文档,mongodb,scala,collections,duplicates,document,Mongodb,Scala,Collections,Duplicates,Document,如果我想使用Scala删除MongoDB集合中的重复文档,应该怎么做 非常确定它很简单,但我总是在Mongo Shell中找到方法来实现它。使用 在本例中,我将使用Scala 2.11的版本2.1.0 我想您希望删除除_id字段外具有相同重复属性的所有文档 我在一个用户集合中有四个文档 { "_id": <ObjectId>, "name": "John", "surname": "Doe" } { "_id": <ObjectId>, "name":
{
"_id": <ObjectId>,
"name": "John",
"surname": "Doe"
}
{
"_id": <ObjectId>,
"name": "John",
"surname": "Doe"
}
{
"_id": <ObjectId>,
"name": "John",
"surname": "Doe"
}
{
"_id": <ObjectId>,
"name": "Dione",
"surname": "Elton"
}
前三行非常简单,我们连接到数据库并获取集合对象。然后,我们从集合中检索所有文档。注意MongoDB Scala驱动程序是异步的,所以我使用future对象来等待结果,因为我需要它们继续
现在是棘手的部分。我要逐行解释。首先,我们将每个文档映射到一个元组,其中第一个元素是没有_id字段的文档,第二个元素是_id
.map { d => (d.filterKeys { x => !x.equals("_id")}, d.get("_id").get ) }
一旦我们有了元组,我们就可以按文档对序列进行分组,而不需要_id字段。它将生成一个映射,其中键是没有_id字段的文档,值是元组序列,表示与键内容相同的每对(没有_id的文档,_id)
.groupBy(_._1)
因为我们对_id感兴趣,所以我们需要获得每个Map对象的值,以及值序列中的每个元素的_id
.map(_._2.map(_._2))
现在我们有一系列的序列。每个序列都包含每个不带_id的唯一文档的_id。下一步是过滤序列,以便我们只包含大小大于1的文档。换句话说,我们正在过滤表示重复文档的_id
.filter(_.size > 1)
让我们先取每个序列的n-1个ID。它们将是要删除的重复文档
.map({ids => ids.take(ids.size - 1)})
让我们把序列展平,这样我们就有了一个_id序列
.flatten
最后,我们可以从集合中删除每个_id。我已经使用foreach方法完成了这项工作,并逐个删除了文档。由于我们使用的是subscribe方法,文档将被异步删除
.foreach{
id => collection.deleteOne(equal("_id", id)).subscribe(
(dr: DeleteResult) => println(dr.getDeletedCount),
(e: Throwable) => println(s"Error when deleting the document $id: $e")
)
}
希望有帮助
.flatten
.foreach{
id => collection.deleteOne(equal("_id", id)).subscribe(
(dr: DeleteResult) => println(dr.getDeletedCount),
(e: Throwable) => println(s"Error when deleting the document $id: $e")
)
}