Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB Scala-删除集合中的重复文档_Mongodb_Scala_Collections_Duplicates_Document - Fatal编程技术网

MongoDB Scala-删除集合中的重复文档

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":

如果我想使用Scala删除MongoDB集合中的重复文档,应该怎么做

非常确定它很简单,但我总是在Mongo Shell中找到方法来实现它。

使用

在本例中,我将使用Scala 2.11的版本2.1.0

我想您希望删除除_id字段外具有相同重复属性的所有文档

我在一个用户集合中有四个文档

{
  "_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")
    )
  }