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