Lo que quiero es dividir una matriz dentro de una matriz y devolver SOLO el elemento de matriz consultado. Pero en cambio obtengo todos los elementos de la primera matriz.
Tengo esta entrada de ejemplo
[ { "name": "admin", "datasets": [ { "name": "test", "datapoints": [ 1, 6, 4, 3, 8, 5, 3 ], "_id": { "$oid": "619288f16733758444a28728" } }, { "name": "more datasets", "datapoints": [ 1, 2, 3, 4, 5, 6, 7, 8 ], "_id": { "$oid": "619289086733758444a2872a" } } ] } ]lo he probado con
db.collection.find({ name: "admin", "datasets.name": "test" }, { "datasets.datapoints": { $slice: [ 0, 3 ] } })El problema aquí es que obtengo todos los elementos de los conjuntos de datos.
[ { "_id": ObjectId("5a934e000102030405000000"), "datasets": [ { "_id": ObjectId("619288f16733758444a28728"), "datapoints": [ 1, 6, 4 ], "name": "test" }, { "_id": ObjectId("619289086733758444a2872a"), "datapoints": [ 1, 2, 3 ], "name": "more datasets" } ], "name": "admin" } ]Pero solo necesito el 1
El resultado debería ser simplemente:
{ datapoints: [1, 6, 4, 3] }Consulta
name :"test" toma la porción de los primeros 4 miembros$first o $arrayElemAt*en los criterios de búsqueda si tiene demasiados administradores, puede agregar también "datasets.name": "test" si tiene un índice en "datasets.name" puede ayudar.
aggregate( [{"$match": {"name": {"$eq": "admin"}}}, {"$set": {"datasets": {"$map": {"input": "$datasets", "in": {"$cond": [{"$eq": ["$$this.name", "test"]}, {"datapoints": {"$slice": ["$$this.datapoints", 0, 4]}, "_id": "$$this._id", "name": "$$this.name"}, null]}}}}}, {"$project": {"_id": 0, "datasets": {"$filter": {"input": "$datasets", "cond": {"$ne": ["$$this", null]}}}}}])