Элемент MongoDB на вложенных схемах и возвращает только этот элемент - PullRequest
0 голосов
/ 27 марта 2020

у меня есть эта схема для простого твиттерного приложения

const userSchema = new Schema ({
    loginInfo: {
        username: String,
        email: String,
        password: String 
    },
    tweets: [{
        content: String,
        likes: Number,
        comments: [{
            owner: String,
            content: String,
            likes: Number
        }]
    }],
    followers: [String],
    following: [String]
})

, и я хочу создать конечную точку, которая будет возвращать только твит с тем же _id , который был задан в качестве параметра на URL .. Я сделал это решение ниже и оно работает правильно, но я считаю, что есть гораздо лучшее решение, чем это ..

const handleTweet = (User) => (req,res) => {
    const { id } = req.params;
    let theTweet = [];
    User.findOne({ "tweets._id": id})
    .then(user => {
        user.tweets.forEach(tweet => {
            if(tweet._id.toString() === id)
                return theTweet.push(tweet)
        })
        res.json(theTweet)
    })
    .catch(err => res.json(err))
}

module.exports = handleTweet;

Еще один вопрос: Лучше ли создавать вложенные схемы как это или создание различных моделей для каждой схемы (в данном случае схема для пользователя и еще одна для твитов)?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Вы можете использовать методы $push & findOneAndUpdate с понедельника goose. Вы можете изменить свой пример так:

User.findOneAndUpdate(id, { $push: { tweets: req.body.tweet } }, {new: true})
    .then((record) => {
      res.status(200).send(record);
    })
    .catch(() => {
      throw new Error("An error occurred");
    });

Обратите внимание на опцию {new: true}, она заставляет метод findOneAndUpdate возвращать запись с редактированием.

Для вашего второго вопрос, рекомендуется разделить модалы, чтобы сделать ваш код более читабельным, понятным и легким для понимания.

1 голос
/ 27 марта 2020

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

Также вместо foreach вы могли бы используйте Array.prototype.find

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...