Documentos de entrada
"data": { "abc": { "Id": "100" }, "xyz": { "Id": "123" } } Explicación : quiero hacer la $match en data.{i} i is parameter si le doy a "abc" as a parameter obtengo el siguiente resultado, quiero pasar los múltiples parámetros a i "abc", "xyz".. ¿Cómo puedo hacer eso para hacer que $ coincida con la clave del objeto usando el parámetro?
Salida esperada :
"data": { "abc": { "Id": "100" }, }$exists let i = "abc"; Schema.find( { ["data."+i]: { $exists: true } }, { ["data."+i]: 1 } )Segunda opción si tiene una lista de claves en una matriz,
$or condición, y preparar parte del proyecto let i = ["abc", "xyz"]; let query = [], project = {}; i.map(k => { query.push({ ["data."+k]: { $exists: true } }); project["data."+k] = 1; }); Schema.find({ $or: query }, project);Tercera opción utilizando operadores de proyecto a partir de MongoDb v4.4, con un enfoque más dinámico,
$objectToArray convertir objeto a matriz$filter para filtrar por encima de la matriz convertida y obtener elementos coincidentes$arrayToObject convierte la matriz de nuevo en objeto let i = "abc"; Schema.find( { ["data."+i]: { $exists: true } }, { data: { $arrayToObject: { $filter: { input: { $objectToArray: "$data" }, cond: { $eq: ["$$this.k", i] } } } } } )Prueba esto:
let keys = ["abc"]; db.collectionName.aggregate([ { $project: { "filteredData": { $filter: { input: { $objectToArray: "$data" }, as: "item", cond: { $in: ["$$item.k", keys] } } } } }, { $project: { data: { $arrayToObject: "$filteredData" } } } ]); Salida: cuando keys = ["abc"];
{ "_id" : ObjectId("60395e36e0c7d52970d3fa21"), "data" : { "abc" : { "Id" : "100" } } } Salida: cuando keys = ["abc", "xyz"];
{ "_id" : ObjectId("60395e36e0c7d52970d3fa21"), "data" : { "abc" : { "Id" : "100" }, "xyz" : { "Id" : "123" } } }