Как я могу использовать для этого агрегатную операцию Mongoose?По сути, у меня есть две коллекции - «Пост» и «Профиль».Пользовательский oid с именем «user» является общей ссылкой между ними.Я хочу использовать идентификатор из «Post», чтобы найти элемент «handle» из «Profile» и объединить эти результаты, чтобы дескриптор пользователя был включен в ответ.
Вот как я смогчтобы достичь этого при поиске одного сообщения:
// @route GET api/posts/:id
// @desc Get post by id
// @access Public
router.get("/:id", (req, res) => {
Post.findById(req.params.id)
.then(post => {
Profile.findOne({ user: post.user })
.then(profile => res.json({ ...post._doc, userHandle: profile.handle }));
})
.catch(err => res.status(404).json({ "not found": err }));
});
Однако, когда я попытался распространить этот подход (используя операцию карты) на GET, который возвращает ВСЕ сообщения, он стал неработоспособным.
// @route GET api/posts
// @desc Get all the posts
// @access Public
router.get("/", (req, res) => {
Post.find()
.sort({ date: -1 })
.then(posts =>
posts.map(
post =>
Profile.findOne({ user: post.user })
.then(profile => (
{
...JSON.parse(JSON.stringify(post)),
userHandle: profile.handle
}))
))
.then(posts => res.json(posts))
.catch(err => res.status(404).json({ "none found": err }));
});
Другими словами, если у меня POST:
{
"_id": {
"$oid": "5d1523b98d9dd16d832a8c5e"
},
"user": {
"$oid": "5d1504e29dc0bd55461adca7"
},
"recipeName": "Pizza",
"ingredients": "Flour and sauch"
}
и PROFILE:
{
"_id": {
"$oid": "5d1505089dc0bd55461adca8"
},
"user": {
"$oid": "5d1504e29dc0bd55461adca7"
},
"handle": "jack",
"status": "Developer"
}
тогдачто мне действительно нужно, так это объект JSON (когда я запрашиваю сообщение): (обратите внимание, что теперь присутствует userHandle)
{
"_id": {
"$oid": "5d1523b98d9dd16d832a8c5e"
},
"user": {
"$oid": "5d1504e29dc0bd55461adca7"
},
"recipeName": "Pizza",
"ingredients": "Flour and sauch",
"userHandle": "jack"
}
Мой GET должен вернуть целый массив этих сообщений.