Tengo ~ 200.000 documentos en una colección que se ven así:
{ "_id": "tdhABqSZPEZ2fFcEzOVCb-q8d", "user": "testuser", "content": "Test Content" }Y tengo una matriz con ~50.000 entradas:
let arr = ["tree", "apple", "test", "orange", ...otherEntries] // ~ 50,000 entries Quiero obtener todos los documentos donde cualquier elemento de la matriz esté en el valor del content , sin distinción entre mayúsculas y minúsculas, de modo que se devuelva el documento de ejemplo anterior porque en la matriz está test y en el contenido del documento está Test .
Esto funcionaría usando $where y luego usando una expresión de JavaScript, pero esto no es muy rápido. ¿Existe una manera realmente rápida (< 1-2 segundos) de realizar una consulta como esta o tiene alguna idea sobre cómo reestructurar los documentos para que pueda realizar una consulta rápida como esta?
Si su lista (arr) era pequeña => podría usar hacer un índice y usar $in y filtrar (pero no es pequeña)
si quisiera distinguir entre mayúsculas y minúsculas => podría hacer la lista en una colección y $ buscar con índices (pero quiere que no se distinga entre mayúsculas y minúsculas)
En el caso de que tenga una lista grande y quiera mayúsculas y minúsculas
únase a la lista en una cadena grande (vamos a MyListString , es una variable en su controlador), separada con espacios, por ejemplo ["sombrero" "árbol"] para convertirse en "árbol de sombrero"
crear un índice de texto sobre el contenido es muy fácil de hacer, por ejemplo, en Java hice mycoll.createIndex(Indexes.text("content")); consulte la documentación de su controlador sobre cómo crear índices de texto.
Haga una búsqueda o una agregación con coincidencia (MyListString es la variable de cadena grande anterior) (esto hace por defecto una coincidencia que no distingue entre mayúsculas y minúsculas)
{ "$match" { "$text" { "$search" MyListString} } }
El tiempo fue < 1 segundo en mi punto de referencia, pruébalo, creo que estarás bien.