Проблемы Удаление элемента в пользовательской модели (массив), не уверены, как сохранить результат - PullRequest
1 голос
/ 16 января 2020

У меня есть пользователь с различными идентификаторами постов в моей базе данных mongodb, я использую mon goose для общения с ним.

это объект пользователя

[
    {
        "premium": true,
        "max_posts": 55,
        "posts_made": 52,
        "posts": [
            "5e10046c0be4f92228f6f532",
            "5e1005a9dceb1344241c74c5",
            "5e100753a6cfcb44d8f1fa09",
            "5e1007bea6cfcb44d8f1fa0a",
            "5e1008149324aa1d002a43be",
            "5e1009562826a308a0812e92",
            "5e100a625e6fcb2c90a07bec",
            "5e157143536d6e04a80651bd",
            "5e1e320dc749f23b189ccef7",
            "5e1e3273546d55384c3a975c",
            "5e1e340183d0b0080816cedd",
            "5e1e368bd921f3194c22b3d2",
            "5e1e3732d921f3194c22b3d3",
            "5e1e3a6f9b3017189cff0fe2",
            "5e1e3c1a8c38f11c60354052",
            "5e1e9ab208d0a5416828d0a3"
        ],
        "_id": "5e0fe3f33c2edb2f5824ddf2",
        "email": "user@gmail.com",
        "createdAt": "2020-01-04T01:01:39.840Z",
        "updatedAt": "2020-01-15T04:53:08.987Z",
        "__v": 16
    }
]

Итак , Я делаю запрос к базе данных, используя express, и я пытаюсь отфильтровать массив, используя идентификатор одного сообщения, затем я прошу express сохранить эту модифицированную модель пользователя ...

router.delete('/testing', (req,res,next) =>{


    userModel.findOne({ email: req.body.author }, function(error, user) {

        user.posts.filter(item => item != req.body.postid)

                user.save((err) => {
                    console.log(err);
                });
            res.json(user)

    });

});

мой запрос в почтальоне:

enter image description here

Как видите, элемент все еще находится в этом массиве ... проверяя console.log.

Пожалуйста, сообщите, поскольку у меня есть сомнения, спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Так я бы сделал, используя оператор $pull.

Оператор $ pull удаляет из существующего массива все экземпляры значения или значений, соответствующих указанному условию.

userModel.update(
    {email: req.body.author},
    { $pull: { posts: { $in: [ req.body.postid ] } } },
    { multi: true }
)

На данный момент кажется, что вы передаете один столб в теле запроса. В будущем, если вам необходимо удалить несколько сообщений одновременно, вы можете использовать один и тот же запрос, просто заменив { $in: [ req.body.postid ] } на { $in: [ ...req.body.postid ] }

0 голосов
/ 16 января 2020

Вам не нужно искать и обновлять документ пользователя, который делает два вызова БД, плюс .filter(), попробуйте это:

router.delete('/testing', (req, res, next) => {

    userModel.findOneAndUpdate({ email: req.body.author},
        { $pull: { "posts": req.body.postid } }, { new: true }, function (error, user) {
            res.json(user);
        });
});

Здесь мы используем .findOneAndUpdate(), поскольку он возвращает обновленный документ пользователя, который нужно отправить обратно.

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