Тук има няколко „много полезни случая“, когато всъщност опитът да се създаде „уникален хеш“ върху съдържанието на масива всъщност „пречи“ на безбройните проблеми, които могат лесно да бъдат адресирани.
Намиране на общо за „Аз“
Ако например вземете „потребител 1“ от предоставената извадка и смятате, че вече сте заредили тези данни и искате да намерите „общите с мен“ чрез съответстващите „itemsIds“ от това, което има текущият потребителски обект, тогава има са два прости подхода за заявки:
-
Намерете „точно“ същото: Това е мястото, където искате да проверите други потребителски данни, за да видите онези потребители, които имат същите „точни“ интереси. Това е просто и „неподредено“ използване на
$всички
оператор на заявка:db.collection.find({ "itemsIds": { "$all": [399957190, 366369952] }, "userId": { "$ne": 1 } })
Което ще върне „потребител 3“, тъй като те са тези с „и двете“ общи записи „itemsIds“. Редът не е важен тук, тъй като винаги има съвпадение във всеки ред, стига и двамата да са там. Това е друга форма на
$and
като аргументи на заявката. -
Намерете „подобно“ общо с мен“: Което всъщност пита "имате ли нещо същото?" . За целта можете да използвате
$inкод>
оператор на заявка. Ще съвпадне, ако е изпълнено „някое“ от посочените условия:db.collection.find({ "itemsIds": { "$in": [399957190, 366369952] }, "userId": { "$ne": 1 } })
В този случай „и двата“ „потребител 2“ и „потребител 3“ ще съвпадат, тъй като те „поне“ споделят „едно“ от посочените условия и това означава, че имат „нещо общо“ с изходните данни на заявката.
Това всъщност е друга форма на
$or
оператор на заявка и точно както преди е много по-просто и стегнато да се пише по този начин предвид условията, които трябва да се прилагат.
Намиране на често срещани „неща“
Има и случаи, в които може да искате да намерите неща "общи", без да имате основен "потребител", от който да започнете. И така, как да разберете, че „потребител 1“ и „потребител 2“ споделят едни и същи „itemIds“ или всъщност, че различни потребители може да споделят една и съща стойност „itemIds“ поотделно, но кои са те?
-
Получете точните съвпадения: Това, разбира се, е мястото, където гледате стойностите на „itemsIds“ и
$group
тях заедно. Като цяло „редът е важен“ тук, така че оптимално е да ги имате „предварително поръчани“ и винаги последователно, за да направите това толкова просто, колкото:db.collection.aggregate([ { "$group": { "_id": "$itemsIds", "common": { "$push": "$userId" } }} ])
И това всъщност е всичко, стига поръчката вече да е налице. Ако не, тогава можете да направите малко по-дълга навита форма, за да направите „подреждането“, но същото може да се каже и за генерирането на „хеш“:
db.collection.aggregate([ { "$unwind": "$itemsIds" }, { "$sort": { "_id": 1, "itemsIds": 1 } }, { "$group": { "_id": "$_id", "userId": { "$first": "$userId" }, "itemsIds": { "$push": "$itemsIds" } }}, { "$group": { "_id": "$itemsIds", "common": { "$push": "$userId" } }} ])
Не е "супер" производителност, но е важно защо винаги поддържате ред при добавяне на записи в масив. Което е много прост процес.
-
Обикновено „потребител“ към „елементи“: Което е друг прост процес на абстрахиране по-горе с „разбиване“ на масива под
$unwind
, и след това основно групиране обратно:db.collection.aggregate([ { "$unwind": "$itemsIds" }, { "$group": { "_id": "$itemsIds", "users": { "$addToSet": "$userId" } }} ])
И отново, просто прост агрегатор за групиране на
$ addToSet
върши работата и събира стойностите на „distinct userId“ за всяка стойност на „itemsIds“.
Това са всички основни решения и мога да продължа с „зададени пресечки“ и какво ли още не, но това е „основното“.
Не се опитвайте да изчислите "хеш", MongoDB така или иначе има добър "арсенал" за съпоставяне на записите. Използвайте го и също го "злоупотребявайте", докато не се счупи. След това опитайте повече.