Tengo una colección en MongoDB que se parece a:
{ "foo": "something", "tag": 0, }, { "foo": "bar", "tag": 1, }, { "foo": "hello", "tag": 0, }, { "foo": "world", "tag": 3, } Si consideramos este ejemplo, hay entradas en la colección con tag de valor 0 , 1 o 3 y estos no son valores únicos, el valor de tag se puede repetir. Mi objetivo es encontrar que falta 2 . ¿Hay alguna manera de hacer esto con una consulta?
consulta1
range(max-min)(setDifference range_above tags) aggregate( [{"$group": {"_id":null, "min":{"$min":"$tag"}, "max":{"$max":"$tag"}, "tags":{"$addToSet":"$tag"}}}, {"$project": {"_id":0, "missing": {"$min": {"$setDifference": [{"$range":[0, {"$subtract":["$max", "$min"]}]}, "$tags"]}}}}])consulta2
difference of tag-mindifference < rank* Pruébelo antes de usarlo para estar seguro, lo probé 3-4 veces parecía estar bien, para una gran colección si tiene muchas etiquetas diferentes, creo que esto es mejor. (el addtoset anterior puede causar problemas de memoria)
aggregate( [{"$setWindowFields": {"output":{"rank":{"$denseRank":{}}, "min":{"$first":"$tag"}}, "sortBy":{"tag":1}}}, {"$set":{"difference":{"$subtract":["$tag", "$min"]}}}, {"$match":{"$expr":{"$lt":["$difference", "$rank"]}}}, {"$group":{"_id":null, "last":{"$max":"$tag"}}}, {"$project":{"_id":0, "missing":{"$add":["$last", 1]}}}])