Tengo esta estructura de datos:
{ date: 0, darwin: [ { d: ['string1', 1, 0, 0, 0] }, { d: ['string2', 1, 0, 0, 0] }, { d: ['string3', 1, 0, 0, 0] } ] }y este esquema:
const mongoose = require('mongoose'); const { Schema } = mongoose; const dataSchema = new Schema({ date: { type: Number, required: false, unique: true, index: true }, humanDate: { type: Date, required: false }, darwin: [ { d: { type: Array, required: false } } ] }); module.exports = mongoose.model('data', dataSchema);Necesito una lista de cadenas dentro de "d", pruebo esto
db.getCollection('data').find({date:0},{'darwin.d.$': 1})pero tengo este error
Error: error: { "operationTime" : Timestamp(1635348468, 1), "ok" : 0, "errmsg" : "positional operator '.$' couldn't find a matching element in the array", "code" : 51246, "codeName" : "Location51246", "$clusterTime" : { "clusterTime" : Timestamp(1635348468, 1), "signature" : { "hash" : BinData(0,"pfgMUIJkpgjlfnQ6cfiEDpSY+3o="), "keyId" : NumberLong("7020434099001098244") } }}He probado varias cosas pero no consigo que me salga la lista de cadenas, no se si estoy aplicando mal el operador '$'
esperaba alguno asi
{ date: 0, darwin: [ { d: 'string1' }, { d: 'string2' }, { d: 'string3' } ] }Puedes usar un método agregado como este:
$match los documentos donde la date tiene el valor deseado$project para mapear sobre la matriz y obtener los valores que desea: para cada elemento en la matriz darwin , obtenga el primer elemento en la matriz d usando $arrayElemAt . db.collection.aggregate([ { "$match": { "date": 0 } }, { "$project": { "_id": 0, "date": 1, "darwin": { "$map": { "input": "$darwin", "as": "m", "in": { "d": { "$arrayElemAt": [ "$$md", 0 ] } } } } } } ])Cual salida es:
[ { "darwin": [ { "d": "string1" }, { "d": "string2" }, { "d": "string3" } ], "date": 0 } ]Ejemplo aquí