Tengo esta porción de colecciones:
[{ "_id": ObjectId("604f3ae3194f2135b0ade569"), "parameters": [ { "_id": ObjectId("602b7455f4b4bf5b41662ec1"), "name": "Purpose", "options": [ { "id": ObjectId("602b764ff4b4bf5b41662ec2"), "name": "debug", "sel": true }, { "id": ObjectId("602b767df4b4bf5b41662ec3"), "name": "performance", "sel": false }, { "id": ObjectId("602b764ff4b4bf5b41662ec4"), "name": "security", "sel": true }, { "id": ObjectId("602b767df4b4bf5b41662ec5"), "name": "Not Applicable", "sel": false } ], "type": "multiple" }] }]Y esta consulta:
db.testCollection.aggregate([ { $unwind: "$parameters" }, { $match: { "parameters._id": ObjectId("602b7455f4b4bf5b41662ec1"), } }, { $addFields: { match: { $filter: { input: "$parameters.options", as: "option", cond: { $and: [ { $eq: ["$$option.id", ObjectId('602b764ff4b4bf5b41662ec2')] }, { $eq: ["$$option.sel", true] } ] } } } } } ])El resultado es una nueva coincidencia de matriz con, en este caso,
"match": [ { "id": ObjectId("602b764ff4b4bf5b41662ec2"), "name": "debug", "sel": true } ]Cómo puedo emparejar, para colecciones, emparejar por ejemplo
"id": ObjectId("602b764ff4b4bf5b41662ec2") and "id": ObjectId("602b764ff4b4bf5b41662ec4")y tiene una matriz de resultados con o dos resultados o vacía?
No estoy seguro de que sea posible en una sola condición dentro $filter , pero puede intentarlo con $let ,
$let declarar una variable llamada filtered y almacenar su resultado filtrado$in para verificar la condición si el tamaño del elemento filtrado es 2 y luego devolver el resultado filtrado; de lo contrario, la matriz en blanco$eq { $addFields: { match: { $let: { vars: { filtered: { $filter: { input: "$parameters.options", as: "option", cond: { $and: [ { $in: [ "$$option.id", [ObjectId("602b764ff4b4bf5b41662ec2"), ObjectId("602b767df4b4bf5b41662ec3")] ] }, { $eq: ["$$option.sel", true] } ] } } } }, in: { $cond: [ { $eq: [{ $size: "$$filtered" }, 2] }, "$$filtered", [] ] } } } } }