usando tutorial nodejs node español cómo crear node.js mongodb find

node.js - tutorial - Encuentre sub documentos utilizando $ in con MongoDB



node js mongodb tutorial español (1)

Como ha visto, los operadores de proyección $ y $elemMatch solo incluyen el primer elemento coincidente.

Para incluir múltiples elementos de matriz filtrados en su proyección de la matriz de comment , puede usar aggregate con el operador $redact lugar de find :

db.getCollection(''test'').aggregate([ {$match: { ''_id'': ObjectId("56479d9c8510369a4ecea3a9"), ''comments.user_id'': {$in : [ ObjectId("563e3337e2bf6c431b297d41"), ObjectId("563f7c0a8db7963420cd5732") ]}, }}, {$redact: { $cond: { if: { $or: [ {$eq: [''$user_id'', ObjectId("563e3337e2bf6c431b297d41")]}, {$eq: [''$user_id'', ObjectId("563f7c0a8db7963420cd5732")]}, {$not: ''$user_id''} ] }, then: ''$$DESCEND'', else: ''$$PRUNE'' } }} ])

$redact itera sobre cada documento como un árbol, manteniendo o recortando los campos de cada documento, tal como lo dicta la expresión $cond .

Se vuelve un poco complicado envolverte en $redact , pero básicamente dice que si el campo user_id del nivel coincide con cualquiera de los dos ObjectIds en tu $in , o no está presente (es decir, como está en el nivel superior del documento) ), incluya los datos; de lo contrario, elimínelos.

Mi tarea es encontrar comments.user_id autores individuales ( comments.user_id ) sobre el artículo ( _id )

{ "_id" : ObjectId("56479d9c8510369a4ecea3a9"), "comments" : [ { "text" : "222", "user_id" : ObjectId("563f2db0e2bf6c431b297d45"), }, { "text" : "333", "user_id" : ObjectId("563f2db0e2bf6c431b297d45"), }, { "text" : "444", "user_id" : ObjectId("563f2db0e2bf6c431b297d45"), }, { "text" : "55555", "user_id" : ObjectId("563e3337e2bf6c431b297d41"), }, { "text" : "00000", "user_id" : ObjectId("563f7c0a8db7963420cd5732"), }, { "text" : "00001", "user_id" : ObjectId("563f7c0a8db7963420cd5732"), } ] }

Mi consulta se ve de la siguiente manera

db.getCollection(''messages'').find({ ''_id'': ObjectId("56479d9c8510369a4ecea3a9"), ''comments.user_id'': {$in : [ ObjectId("563e3337e2bf6c431b297d41"), ObjectId("563f7c0a8db7963420cd5732") ]} })

Devuelve todos los comentarios. Por favor ayuda a entender por qué sucede.

Resultado Esperado

{ "_id" : ObjectId("56479d9c8510369a4ecea3a9"), "comments" : [ { "text" : "55555", "user_id" : ObjectId("563e3337e2bf6c431b297d41"), }, { "text" : "00000", "user_id" : ObjectId("563f7c0a8db7963420cd5732"), }, { "text" : "00001", "user_id" : ObjectId("563f7c0a8db7963420cd5732"), } ] }

consulta de actualización (desesperanza)

db.getCollection(''messages'').find( {''_id'': ObjectId("56479d9c8510369a4ecea3a9")}, {''comments.user_id'': {$in: ["563f2db0e2bf6c431b297d45", "563e3337e2bf6c431b297d41"]}}, {''comments.user_id'': {$elemMatch: {$in: ["563f2db0e2bf6c431b297d45", "563e3337e2bf6c431b297d41"]}}} ) db.getCollection(''messages'').find( {''_id'': ObjectId("56479d9c8510369a4ecea3a9")}, {comments: {$elemMatch: {''user_id'': {$in : [ObjectId("563f2db0e2bf6c431b297d45"), ObjectId("563f7c0a8db7963420cd5732")]}}}} )

Devuelvo solo 1 registro, y tengo todos los registros de estos autores