Coincidencia de un campo de matriz que contiene cualquier combinación de la matriz proporcionada en MongoDB

Me gustaría consultar con una lista específica de elementos de la matriz, de modo que los documentos devueltos solo puedan contener los elementos que paso, pero no es necesario que contengan todos.

Documentos dados como:

{ name: "Article 1", tags: ["Funny", "Rad"] } { name: "Article 2", tags: ["Cool", "Rad] } { name: "Article 3", tags: ["Rad"] } 

Aquí hay algunos arreglos de ejemplo y sus respectivos resultados.

  • ["Rad"] debería devolver el Artículo 3
  • ["Rad", "Cool"] debería devolver el Artículo 2 y el Artículo 3
  • ["Funny", "Cool"] debe devolver nada, ya que no hay artículos con solo una de esas tags o ambas

Estoy seguro de que puedo llevarlo a cabo con $where pero me gustaría evitar eso por razones obvias.

Puedes hacer esto combinando múltiples operadores:

 db.test.find({tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}}}) 

El $elemMatch con el $nin encuentra los documentos donde un solo elemento de tags no es ni ‘Rad’ ni ‘Cool’, y luego el padre $not invierte la coincidencia para devolver todos los documentos que no coinciden con ningún elemento.

Sin embargo, esto también devolverá documentos donde faltan tags o no tiene elementos. Para excluir aquellos que necesita agregar un calificador que asegure que las tags tienen al menos un elemento:

 db.test.find({ tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}}, 'tags.0': {$exists: true} })