mongo 查找不使用某人索引的数据

mongo find data not using someone index

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

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条数据并修复它。

谢谢

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

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

找到原因了。 uri 长度超过 1024 并且数据不是 indexed.The DBA colse failIndexKeyTooLong。但是我还是找不到这部分数据