简体   繁体   中英

sort documents by their children in mongoose

I have a mongodb collection as follows:

[
  {
    "_id": { "$oid": "609b8f06a28f6728d19b486d" },
    "user1": "609952c2b112741634d27d89",
    "user2": "609b8202b5a389099cae3ce6",
    "messages": [
      {
        "body": "Hello user 2",
        "user": "609952c2b112741634d27d89",
        "readed": true,
        "created": { "$date": "2021-05-13T01:38:07.502Z" }
      },
      {
        "body": "How old are you?",
        "user": "609952c2b112741634d27d89",
        "readed": false,
        "created": "2021-05-13T01:40:07.502Z"
      },
      {
        "body": "I am fine. Are you ready?",
        "user": "609b8202b5a389099cae3ce6",
        "readed": false,
        "created": "2021-05-13T01:42:07.502Z"
      },
      {
        "body": "Yes. Lighgui start",
        "user": "609952c2b112741634d27d89",
        "readed": false,
        "created": "2021-05-13T01:38:50.502Z"
      }
    ]
  }
]

I want to sort chats that have messages up first how do I do that?

also if possible i would like to get the latest message of each chat and the number of messages with readed=false

You can use

  • $unwind to destructure the array
  • $sort to sort the array based on created of messages
  • $group to restructure the array

Here is the code

db.collection.aggregate([
  {
    $unwind: {
      path: "$messages",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    "$sort": {"messages.created": 1 }
  },
  {
    "$group": {
      "_id": "$_id",
      user1: { $first: "$user1" },
      user2: { $first: "$user2" },
      "messages": { "$push": "$messages" }
    }
  }
])

Working Mongo playground

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM