В приложении, над которым я работаю, требуется сделать массивное пересечение наборов, чтобы было около 10-1 000 000 элементов или около того.Элементы, которые мы пересекаем, просто ObjectId.
Так, например, есть документ box, а внутри документа box - массив item_ids.Этот массив item_ids для каждого блока содержит 10-1 000 000 ObjectId.
Конечная цель здесь состоит в том, чтобы сказать, заданный блок A с ObjectId 4d3dc3898951498107000005 и блок B с ObjectId 4d3dc3898951498107000002, какие item_ids у них общие?
Вот как я это делаю:
db.boxes.distinct("item_ids", {'_id' : {$in : [ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}})
Во-первых, просто любопытно, если это похоже на здравый подход.В моем исследовании до сих пор кажется, что уменьшение карты - это общее предложение для больших пересечений, но оно не рекомендуется для запросов в реальном времени.
Во-вторых, любопытно, как это будет вести себя в закрытой среде?Будут ли монго выполнять часть запроса на монгоде, который ему необходим, и магически агрегировать мой результат?
Наконец, если вышеупомянутое является нормальным, это также разумно делать:
db.items.find({'_id' : { $in : db.eval(function() {return db.boxes.distinct("item_ids", {_id:{$in:[ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}}); }) }})
Который в основном будет находить, какие элементы, как у блока A, так и у блока B, общими, а затем материализует их в объекты в одном запросе на стороне сервера.Похоже, это также работает с .limit и .skip для эффективной реализации разбиения на страницы набора данных.
В любом случае, любая обратная связь ценна, спасибо!