Как заполнить поле в MongoDB совокупный результат поиска $? - PullRequest
0 голосов
/ 04 мая 2020

Я не могу найти решение, используя другие ответы на inte rnet или мои попытки. Вот почему я создаю новый вопрос.

У меня есть 2 коллекции - сообщений , пользователей , и я использую MongoDB + Mon goose.

Как я могу использовать агрегат, чтобы все пользователи принадлежали к определенной записи?

Мне нужно что-то вроде заполнить , но мне нужно использовать агрегат (я использую более сложный агрегат, это просто пример)

У меня есть поле лайки который содержит всех пользователей , которым понравился определенный пост. Так что likes.users.user содержит идентификатор для понравившегося пользователя.

Как я могу изменить это поле через агрегат для хранения объекта с пользовательской информацией вместо просто идентификатора? См. желаемый вывод , пожалуйста.

До совокупного вывода:

{
    "_id": "5eb011af5c9246204944156e",
    "title": "My awesome blog post",
    "likes": {
        "count": 3,
        "users": [
            {
                "_id": "5eb011ba5c92462049441570",
                "user": "5e915d5e116d010560470107"
            },
            {
                "_id": "5eb012535c92462049441576",
                "user": "5e915d76116d010560470108"
            },
            {
                "_id": "5eb018d57ae41a2171478ff1",
                "user": "5e915d8b116d010560470109"
            }
        ]
    }
}

Желаемый вывод:

{
    "_id": "5eb011af5c9246204944156e",
    "title": "My awesome blog post",
    "likes": {
        "count": 3,
        "users": [
            {
                "_id": "5eb011ba5c92462049441570",
                "user": {
                    "_id": "5e915d5e116d010560470107",
                    "name": "John Doe",
                    "role": "member"
                } 
            }, 
            {
                "_id": "5eb011ba5c92462049441576",
                "user": {
                    "_id": "5e915d5e116d010560470108",
                    "name": "Daniel Grant",
                    "role": "member"
                } 
            },
            {
                "_id": "5eb018d57ae41a2171478ff1",
                "user": {
                    "_id": "5e915d5e116d010560470109",
                    "name": "Tiffany Holland",
                    "role": "administrator"
                } 
            }
        ]
    }
}

Текущий неверный вывод:

{
    "_id": "5eb011af5c9246204944156e",
    "title": "My awesome blog post",
    "likes": {
        "count": 3,
        "users": [
            {
                "_id": "5eb011ba5c92462049441570",
                "user": {
                    "_id": "5e915d5e116d010560470107",
                    "name": "John Doe",
                    "role": "member"
                } 
            }, 
            {
                "_id": "5eb011ba5c92462049441576",
                "user": {
                    "_id": "5e915d5e116d010560470107",
                    "name": "John Doe",
                    "role": "member"
                } 
            },
            {
                "_id": "5eb018d57ae41a2171478ff1",
                "user": {
                    "_id": "5e915d5e116d010560470107",
                    "name": "John Doe",
                    "role": "member"
                } 
            }
        ]
    }
}

Это в основном то, что мне нужно, но это только один пользователь из 3, и он показывает дубликаты. Почему?

Совокупность, которую я пробовал:

const aggregatedData = await Post.aggregate([
    { $match: { _id: mongoose.Types.ObjectId( id ) } },
    {
        $lookup: {
            from: "users",
            localField: "likes.users.user",
            foreignField: "_id",
            as: "likesUsers"
        }
    },
    {
        $unwind: "$likesUsers"
    },
    {
        $addFields: {
            "likes.users.user": "$likesUsers",
        }
    },
    {
        $project: {
            "likesUsers": 0,
        }
    }
]);

Спасибо

1 Ответ

0 голосов
/ 05 мая 2020

Эта агрегация даст желаемый результат.

db.posts.aggregate([
  {
      $lookup: {
          from: "users",
          localField: "likes.users.user",
          foreignField: "_id",
          as: "likesUsers"
      }
  },
  { 
      $addFields: {
          "likes.users": {
              $map: {
                   input: "$likes.users", as: "usr",
                   in: {
                       user: {
                           $arrayElemAt: [ 
                               { $filter: {
                                     input: "$likesUsers", as: "likeUsr",
                                     cond: {
                                         $eq: [ "$$usr.user", "$$likeUsr._id" ]
                                     }
                                }
                            }, 0 ]
                       },
                       _id: "$$usr._id"
                   } 
               }
           }
      }
  },
  {
      $project: { likesUsers: 0 }
  }
] )
...