mongodb - Get document based on last item in arrays property -
i need retrieve orders, based on status code on property on last element in array.
my structure follows.
{ "_id" : "3580bdba-4017-40af-939d-7391d70b3511", "ispublic" : true, "mailreceiptdispatch" : { "transfersupervisor" : { "transferstatuses" : [{ "transferstate" : 0, "transfertime" : isodate("2015-05-29t11:21:20.722z") }, { "transferstate" : 1, "transfertime" : isodate("2015-05-29t11:54:10.013z") }, { "transferstate" : 2, "transfertime" : isodate("2015-05-29t11:54:12.462z") }], "istransferedlimitreached" : false, "latesttransferingstatus" : { "transferstate" : 2, "transfertime" : isodate("2015-05-29t11:54:12.462z") } }, "exceptionlog" : [], "haswarningbeensent" : false } }
so need objects need based on like: {mailreceiptdispatch.tranfersupervisor.transferstatuses.[get last in array].transferstate : 2}`
i tried slice
, retrieve object. mi need @ objects property. elemmatch
might useful, can't figure out how connect both slice , elemmatch.
mongo aggregation used find out last transferstate
, first unwind transferstatuses
array , used either sort
or max
in aggregation latest transferstate
below :
1> sort transfertime
in aggregation :
db.collectionname.aggregate({"$unwind":"$mailreceiptdispatch.transfersupervisor.transferstatuses"}, {"$sort":{"mailreceiptdispatch.transfersupervisor.transferstatuses.transfertime":-1}}, {"$group":{"_id":"$_id","transferstate":{"$first":"$mailreceiptdispatch.transfersupervisor.transferstatuses.transferstate"}, "transfertime":{"$first":"$mailreceiptdispatch.transfersupervisor.transferstatuses.transfertime"}}} ).pretty()
2> use max
in aggregation :
db.collectionname.aggregate({"$unwind":"$mailreceiptdispatch.transfersupervisor.transferstatuses"}, {"$group":{"_id":"$_id","transferstate":{"$max":"$mailreceiptdispatch.transfersupervisor.transferstatuses.transferstate"}, "transfertime":{"$max":"$mailreceiptdispatch.transfersupervisor.transferstatuses.transfertime"}}} ).pretty()
Comments
Post a Comment