Benzer Diziye Sahip Firestore Sorgu Belgeleri (Node.js / Admin SDK)

Aug 16 2020

Bu diziye sahip olduğunuzu hayal edin

[10.3, 14, 12.4, 3.5]

ve DB'nizde bu dizilere sahip iki belge de var:

First document -> [10, 13.1, 0, -10]
Second document -> [0, 0, 0, 0]

Şimdi aynı iki diziye sahip (her biri arasında değişen) +1000000 belgeniz olduğunu hayal edin ... Geçerli dizinizle benzer değerlere sahip tüm belgeleri almanın bir yolu var mı?

Demek istediğim, bunun gibi bir şey:

   ...
   .where("array", "isSimilar", yourArray)
   .get()

Böylece diziye sahip tüm belgeleri elde ederim:

[10, 13.1, 0, -10]

Ya da tek yol, her bir belgeyi, gerçekten yavaş olabilecek bir şeyi indirmek ve ardından yineleyerek en benzerini aramak mı? "Benzer puan pozisyonları", "bir kullanıcının benzer kilo kaybettiği haftalar" hakkında konuşurken bunun gerçekten ilginç olabileceğini düşünüyorum ...

Teşekkürler.

Yanıtlar

3 JayCodist Aug 16 2020 at 09:20

Şu anda firestore bu tür sorguları desteklemiyor. Bu nedenle, dizi karşılaştırması için yapınızı bir String alanı içerecek şekilde güncellemenizi öneririm. Yani her belge şöyle görünecektir:

{
   array: [12, 11, 8, 9],
   arrayStr: "12,11,8,9",
   ...
}

Bu yapıya doc.array.join(","), mevcut tüm belgeleri arayarak ve değeri belgeye kaydederek kolayca ulaşabilirsiniz.

Ardından, aşağıdaki gibi firestore sorgusu ile karşılaştırmalar yapmak mümkün olacaktır:

const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.join(",")).get();
...

GÜNCELLEME: Eşitlik yerine benzerlikle karşılaştırmak için olası bir yaklaşım, "benzerlik" mantığınızı arrayStroluşturma sırasında alana uygulamaktır. Örneğin, 0,5'ten küçük farklılıkların tolere edilmesini istiyorsanız Math.round(), dize olarak kaydetmeden önce dizi öğelerinde kullanabilirsiniz . Şöyle:

const array = [12.2, 10.7, 8.111, 9.0];
const arrayStr = array.map(num => Math.round(num)).join(","); //"12,11,8,9"

Sonra şu şekilde sorgulayacaksınız:

const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.map(num => Math.round(num)).join(",")).get();
// Results would include arrays like [12.2, 10.7, 8.111, 9.0]
...

Elbette Math.round(), karşılaştırmalar için tolerans düzeyini artırmak veya azaltmak için aktarılan argümanı değiştirebilirsiniz .