首页 > 解决方案 > mongo查找不使用某人索引的数据

问题描述

我有一个唯一索引,但是现在有些数据没有这个索引,导致数据重复,我想把这部分数据找出来,我想查询没有这个索引的数据。像这样:

MongoDB shell version v3.6.8
MongoDB server version: 4.0.12

# there is no not_hint func
db.col.find().not_hint("md5_1_domain_1_ip_1_uri_1")

# hint not allowed to use $ne
db.col.find()._addSpecial("$hint", {"$ne": {"md5" : 1, "domain" : 1, "ip" : 1, "uri" : 1}})

唯一索引

{
                "v" : 2,
                "key" : {
                        "md5" : "hashed"
                },
                "name" : "md5_hashed",
                "ns" : "mdm.col"
},
{
                "v" : 2,
                "unique" : true,
                "key" : {
                        "md5" : 1,
                        "domain" : 1,
                        "ip" : 1,
                        "uri" : 1
                },
                "name" : "md5_1_domain_1_ip_1_uri_1",
                "background" : true,
                "ns" : "mdm.col"
}

数据,我修改了一些敏感信息,我确信它们是一样的。并且无法通过唯一索引查询数据。仅使用 _id 或其他索引进行查询。

mongos>  db.col.find({ "_id" : ObjectId("5fb2df3b32b0f42dced04ea7")})
{ "_id" : ObjectId("5fb2df3b32b0f42dced04ea7"), "domain" : null, "ip" : 1, "md5" : BinData(5,"anQTYWNGHKoj4xx+KTjNxQ=="), "uri" : "x * 1025", "count" : 6, "fseen" : ISODate("2019-08-03T13:56:38Z"), "lseen" : ISODate("2019-08-03T13:56:38Z"), "sha1" : null, "sha256" : null, "src" : [ "xx2", "xx3" ] }
mongos>  db.col.find({'_id': ObjectId('5fb2df3d32b0f42dced0721d')})
{ "_id" : ObjectId("5fb2df3d32b0f42dced0721d"), "domain" : null, "ip" : 1, "md5" : BinData(5,"anQTYWNGHKoj4xx+KTjNxQ=="), "uri" : "x * 1025", "count" : 6, "fseen" : ISODate("2019-08-03T13:56:38Z"), "lseen" : ISODate("2019-08-03T13:56:38Z"), "sha1" : null, "sha256" : null, "src" : [ "xx2", "xx3" ] }
mongos>  db.col.find({"md5": BinData(5,"anQTYWNGHKoj4xx+KTjNxQ=="), "uri": "x * 1025", "ip": 1}
mongos>  # it is None

而这个信息:

mongos> db.col.find().count()
5549020886
mongos> db.col.find().hint("md5_1_domain_1_ip_1_uri_1").count()
5521037206

uri 长度超过 1024 并且数据没有被索引。我想找到那个 27983680 术语数据并修复它。

谢谢

标签: mongodbmongodb-querypymongo

解决方案


奇怪怎么可能。无论如何,您可以使用此聚合管道找到重复数据:

db.col.aggregate([
   {
      $group: {
         _id: {
            md5: "$md5",
            domain: "$domain",
            ip: "$ip",
            uri: "$uri"
         }
      },
      count: { $sum: 1 },
      ids: { $push: "$_id" }
   },
   { $match: { count: { $gt: 1 } } }
], { allowDiskUse: true })

结果具有来自重复数据ids的数组的字段。_id


推荐阅读