MongoDB 查询查找数组中具有重复值的文档

fuk*_*uri 5 arrays mapreduce mongodb

太棒了;我正在努力构造一个查询

  1. 进行聚合以获取某个键(“original_text_source”)上的值的计数,其中
  2. 位于数组中的子文档中

详细描述

我嵌入了带有数组的文档,其结构如下:

{
    "_id" : ObjectId("0123456789"),
    "type" : "some_object",
    "relationships" : {
        "x" : [ ObjectId("0123456789") ],
        "y" : [ ObjectId("0123456789") ],
    },
    "properties" : [ 
        {
            "a" : "1"
        }, 
        {
            "b" : "1"
        }, 
        {
            "original_text_source" : "foo.txt"
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

这些文档是由 10k 文本文件创建的,这些文本文件排序在不同的文件夹中。在将文档插入 MongoDB(批量)期间,我弄乱了一些文件,导致一个文件被导入两次(我的数据库有 10001 个文档),但显然我不知道它是哪一个。由于“original_text_source”值之一的计数必须为 2,因此我打算只删除一个。

我阅读了 的解决方案$elemMatch,但由于我的数组元素是一个文档,我不确定如何继续。也许与mapReduce?但我无法将逻辑转移到我的文档结构中。

我也可以创建一个新集合并重新上传所有集合,但以防万一我再次搞砸,我宁愿学习如何查询重复项。看起来更优雅:-)

bar*_*ini 4

您可以通过像这样的简单聚合来查找重复项:

db.collection.aggregate(
{ $group: { _id: "$properties.original_text_source", docIds: { $push: "$_id" }, docCount: { $sum: 1 } } },
{ $match: { "docCount": { $gt: 1 } } }
)
Run Code Online (Sandbox Code Playgroud)

这给了你这样的东西:

{
"_id" : [ 
    "foo.txt"
],
"docIds" : [ 
    ObjectId("59d6323613940a78ba1d5ffa"), 
    ObjectId("59d6324213940a78ba1d5ffc")
],
"docCount" : 2.0
}
Run Code Online (Sandbox Code Playgroud)