Estoy usando la agregación en MongoDB y ahora me enfrento a un problema, quiero proyectar mis campos en función de una condición que coincida o no.
Por ejemplo, tengo un campo coupon_type para el cual verificaré si su valor es igual a 1, luego proyectaré los campos ["curr_ctr", "total_coupons"] lo contrario, si su valor no es igual a 1, proyectaré los campos ["curr_ctr", "total_coupons", "curr_ctr", "coupons"].
Puedo usar dos consultas y ejecutarlas en paralelo, pero estoy tratando de lograr mi resultado usando una sola consulta.
¿Alguien puede decirme cómo puedo hacer esto en una sola consulta?
ACTUALIZAR
Mis documentos son como a continuación
[{ "_id" : ObjectId("5878e1edf1df5a2b69bcf60e"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , { "_id" : ObjectId("5878e1eff1df5a2b69bcf60f"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 0 } , { "_id" : ObjectId("5878e1f1f1df5a2b69bcf610"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , { "_id" : ObjectId("5878e1f3f1df5a2b69bcf611"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , { "_id" : ObjectId("5878e1f5f1df5a2b69bcf612"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 11 } , { "_id" : ObjectId("5878e1f7f1df5a2b69bcf613"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 110 }, { "_id" : ObjectId("5878e1f9f1df5a2b69bcf614"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 0 } ] Ahora, para todos los tipos de cupón iguales a 0, quiero proyectar campos ["curr_ctr", "total_coupons", "curr_ctr", "coupons"] y para todos los tipos de cupón que no sean iguales a 0, quiero proyectar campos ["curr_ctr", "total_coupons"]
ACTUALIZAR
En realidad, quiero proyectar una matriz de coupons desde el índice n hasta n+1, donde n es la entrada del usuario.
Considere que su colección contiene los siguientes documentos
[{ "_id" : ObjectId("5878e1edf1df5a2b69bcf60e"), "coupon_type" : 1 } , { "_id" : ObjectId("5878e1eff1df5a2b69bcf60f"), "coupon_type" : 0 } , { "_id" : ObjectId("5878e1f1f1df5a2b69bcf610"), "coupon_type" : 1 } , { "_id" : ObjectId("5878e1f3f1df5a2b69bcf611"), "coupon_type" : 1 } , { "_id" : ObjectId("5878e1f5f1df5a2b69bcf612"), "coupon_type" : 11 } , { "_id" : ObjectId("5878e1f7f1df5a2b69bcf613"), "coupon_type" : 110 }, { "_id" : ObjectId("5878e1f9f1df5a2b69bcf614"), "coupon_type" : 0 } ] Ahora necesita usar $eq en el project como:
db.collectoin.aggregate({ "$project": { "result": { "$cond": { "if": { "$eq": ["$coupon_type", 1] }, "then": ["curr_ctr", "total_coupons"], "else": ["curr_ctr", "total_coupons", "curr_ctr", "coupons"] } } } })Según la nueva actualización, debe modificar la consulta de esta manera:
db.collection.aggregate({ "$project": { "result": { "$cond": { "if": { "$eq": ["$coupon_type", 1] }, "then": ["$curr_ctr", "$total_coupons", "$coupons"], "else": ["$curr_ctr", "$total_coupons"] } } } })ACTUALIZAR
Según la nueva actualización, considere su n dada por el usuario, por ej. : var n = 1 ;
ahora la consulta será la siguiente:
db.coupon.aggregate({ "$project": { "result": { "$cond": { "if": { "$eq": ["$coupon_type", 1] }, "then": ["$curr_ctr", "$total_coupons", { "coupons": { "$slice": ["$coupons", n, n + 1] } }], "else": ["$curr_ctr", "$total_coupons"] } } } })