Выберите определенные поля в схеме вложенных объектов карты в Mongo DB

#mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #структура агрегации

Вопрос:

Например: — Ниже приведен образец документа в коллекции «клубы»,

Образец документа

 {
    "_id" : ObjectId("5cb8218ce2911e7c707e27fa"),
    "name" : "name 1",
    "members" : {
        "user_1" : {
            "created" : ISODate("2019-04-18T07:04:44.748Z"),
            "lastActive" : 1555584757282,
            "state" : 1,
            "unreadMessages" : 0,
            "userId" : "user_1_id"
        },
        "user_2" : {
            "lastActive" : 1555588409686,
            "state" : 1,
            "unreadMessages" : 0,
            "userId" : "user_2_id"
        }
    }
}
 

Запрос Mongo DB должен возвращать следующие поля :-

Желаемый результат-

 {
    {
        "_id" : ObjectId("5cb8218ce2911e7c707e27fa"),
        "name" : "name 1",
        "members" : {
            "user_1" : {
                "lastActive" : 1555584757282
            },
            "user_2" : {
                "lastActive" : 1555588409686
            }
         }
    }
}
 

Ответ №1:

Вы можете использовать приведенную ниже агрегацию

 db.collection.aggregate([
  { "$addFields": {
    "members": {
      "$arrayToObject": {
        "$map": {
          "input": { "$objectToArray": "$members" },
          "in": {
            "k": "$this.k",
            "v": { "lastActive": "$this.v.lastActive" }
          }
        }
      }
    }
  }}
])
 

Example

Комментарии:

1. Имя пользователя в объекте members может отличаться в каждом документе. Мне нужно написать запрос, чтобы найти временную метку lastActive во всех документах для всех разных пользователей.