en la siguiente imagen, estoy usando $project aggregation. Necesito comparar si el campo de texto es igual a 'A' o si no usa $cond . Si esta condición booleana es verdadera, debería devolver 1; de lo contrario, 0. pero muestra que Stage debe tener el formato correcto.
{ 'answers.Urban_City.text': 1, SEC_A: {$cond:['answers.SEC.text':['$eq','A'], 1, 0]} }enlace de la imagen de la brújula
Documento de muestra tengo varios documentos como este
{ "_id": { "$oid": "61dea2c1169cd059e2d1a06e" }, "metaKey": { "projectId": 7, "sectionId": 5, "userId": 5, "simpleSurveyResponseCode": "58836213476714" }, "answers": [ { "Urban_City": { "text": "Karachi", "value": "72" } }, { "SEC": { "text": "A", "value": "1" } } ], "__v": 0 }Quiero algo como esto
db.Sentiments.aggregate( { $project: { _id: 0, Company: 1, PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]}, NegSentiment: {$cond: [{$lt: ['$Sentiment', 0]}, '$Sentiment', 0]} }}, { $group: { _id: "$Company", SumPosSentiment: {$sum: '$PosSentiment'}, SumNegSentiment: {$sum: '$NegSentiment'} }});pero en el lugar de Sentiment tengo SEC, que es una matriz incrustada que contiene dos campos ( String ) mencionados en el documento de muestra. donde me he atascado en la agregación de $ proyecto si esto se resuelve, $ grupo sería fácil para mí.
Prueba este:
db.collection.aggregate([ { $project: { 'answers.Urban_City.text': 1, SEC_A: { $map: { input: "$answers", in: { $cond: [{ $eq: ['$$this.SEC.text', 'A'] }, 1, 0] } } } } } ])Si proporciona una salida de muestra deseada, el cambio será mucho mayor para recibir una respuesta adecuada.