varios texto relacionados registros proyecciones insertar filtros embebidos documentos contar busquedas buscar mongodb

texto - Encuentre documentos con matrices que no contengan un documento con un valor de campo particular en MongoDB



mongodb documentos relacionados (2)

Estoy tratando de encontrar todos los documentos que no contienen al menos un documento con un valor de campo específico. Por ejemplo, aquí hay una colección de muestra:

{ _id : 1, docs : [ { foo : 1, bar : 2}, { foo : 3, bar : 3} ] }, { _id : 2, docs : [ { foo : 2, bar : 2}, { foo : 3, bar : 3} ] }

Quiero encontrar cada registro donde no haya un documento en el bloque de documentos que no contenga al menos un registro con foo = 1. En el ejemplo anterior, solo se debe devolver el segundo documento.

He intentado lo siguiente, pero solo me dice si hay alguno que no coincida (lo que devuelve el documento 1).

db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })

ACTUALIZACIÓN: la consulta anterior realmente funciona. Como sucede muchas veces, mis datos estaban equivocados, no mi código.

También miré el operador $ nin pero los ejemplos solo muestran cuando la matriz contiene una lista de valores primitivos, no un documento adicional. Cuando he tratado de hacer esto con algo como lo siguiente, busca el documento EXACTO en lugar de solo el campo foo que quiero.

db.collection.find({"docs": { $nin: {''foo'':1 } } })

¿Hay alguna forma de lograr esto con los operadores básicos?


Usar $nin funcionará, pero tiene la sintaxis incorrecta. Debería ser:

db.collection.find({''docs.foo'': {$nin: [1]}})


Use el operador $ne :

db.collection.find({''docs.foo'': {$ne: 1}})

Actualización: recomendaría no usar $nin en este caso.

{''docs.foo'': {$ne: 1}} toma todos los elementos de los docs , y para cada uno de ellos verifica si el campo foo es igual a 1 o no. Si encuentra una coincidencia, descarta el documento de la lista de resultados.

{''docs.foo'': {$nin: [1]}} toma todos los elementos de los docs , y para cada elemento verifica si su campo foo coincide con cualquiera de los miembros de la matriz [1] . Este es un producto cartesiano , usted compara una matriz con otra matriz, cada elemento con cada elemento. Aunque MongoDB podría ser inteligente y optimizar esta consulta, supongo que solo usa $nin porque "tiene que ver con algo con matrices". Pero si comprende lo que hace aquí, se dará cuenta de que $nin es superfluo, y posiblemente tenga un desempeño inferior.