MongoDB搜索索引中的空白

时间:2018-01-29 22:23:42

标签: mongodb

我正在缓存来自在线资源的数据,以便将来用于机器学习。这些数据是规范的,没有遗漏的条目。

如果删除实时连接或重新启动计算机,我会设置一个安全措施,对缓存中缺少的一系列ID进行历史搜索。

然而,我还没有实现的是一种搜索集合并识别已跳过id值的范围的机制。

例如:

{"entry_id": 27497713, ...}
{"entry_id": 27497761, ...}

此数据有明显的差距,2749771327497761之间缺少参赛作品。

有没有办法可以使用查询找到这样的差距?也许至少通过选择两个范围之间的值并检查返回条目的数量来缩小范围?鉴于该集合包含多少条目,我试图避免大量的查询效率。

1 个答案:

答案 0 :(得分:1)

你可以尝试这种聚合

  1. $group - 获取$min$max
  2. $addFields - $range生成$min$max entry_id
  3. $lookup - 使用生成的范围ID和条目ID进行自我查找
  4. $project - 使用setDifference
  5. 仅获取不匹配的范围ID

    管道

    db.entries.aggregate(
        [
            {$group : {_id : null, min : {$min : "$entry_id"}, max : {$max : "$entry_id"}}},
            {$addFields : {rangeIds : {$range : ["$min", "$max"]}}},
            {$lookup : {from : "entries", localField : "rangeIds", foreignField : "entry_id", as : "entries"}},
            {$project : {_id :0, missingIds : {$setDifference : ["$rangeIds", "$entries.entry_id"]}}}
        ]
    )
    

    集合

    > db.entries.find()
    { "_id" : ObjectId("5a6fea9b7346ce591a17ad22"), "entry_id" : 27497713 }
    { "_id" : ObjectId("5a6fea9b7346ce591a17ad23"), "entry_id" : 27497761 }
    { "_id" : ObjectId("5a6fea9b7346ce591a17ad24"), "entry_id" : 27497750 }
    > 
    

    汇总结果

    > db.entries.aggregate( [ {$group : {_id : null, min : {$min : "$entry_id"}, max : {$max : "$entry_id"}}}, {$addFields : {rangeIds : {$range : ["$min", "$max"]}}}, {$lookup : {from : "entries", localField : "rangeIds", foreignField : "entry_id", as : "entries"}}, {$project : {_id :0, missingIds : {$setDifference : ["$rangeIds", "$entries.entry_id"]}}} ] )
    { "missingIds" : [ 27497714, 27497715, 27497716, 27497717, 27497718, 27497719, 27497720, 27497721, 27497722, 27497723, 27497724, 27497725, 27497726, 27497727, 27497728, 27497729, 27497730, 27497731, 27497732, 27497733, 27497734, 27497735, 27497736, 27497737, 27497738, 27497739, 27497740, 27497741, 27497742, 27497743, 27497744, 27497745, 27497746, 27497747, 27497748, 27497749, 27497751, 27497752, 27497753, 27497754, 27497755, 27497756, 27497757, 27497758, 27497759, 27497760 ] }
    >