0

I have documents like

[{"_id" : "12","name" : "test1", "nesArray" : [1,2], "createdAt" : ISODate("2016-10-15T06:17:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:17:54.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,4], "createdAt" :ISODate("2016-10-15T06:17:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,2], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,2],"createdAt" :ISODate("2016-10-15T06:19:53.946Z") } ]

and I want to retrieve only those document which have

  1. Distinct nesArray
  2. Only latest document

Result should be like

   [{"_id" : "12","name" : "test1", "nesArray" : [1,4], "createdAt" :ISODate("2016-10-15T06:17:53.946Z") },
    {"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
    {"_id" : "12","name" : "test1", "nesArray" : [1,2],"createdAt" :ISODate("2016-10-15T06:19:53.946Z") }]

I tried it with aggregation but I don't want to use aggregation(Mongoose populate is not work with aggregation).

Rishabh Garg
  • 706
  • 1
  • 9
  • 28

1 Answers1

0

It's basically what you tried, but getting all fields using $last and projecting after to have same structure as in DB:

db.coll.aggregate(
  { 
    $sort: { createdAt: 1 }
  }, 
  {
    $group: {
      _id: "$nesArray", 
      id: { $last: "$_id" }, 
      name: {$last: "$name"}, 
      createdAt: { $last: "$createdAt"}
    }
  },
  {
    $project: {
      _id: "$id",
      nesArray: "$_id",
      name: 1,
      createdAt: 1
    }
  }
)
Marcelo Risse
  • 514
  • 3
  • 6