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

Это пользовательский объект

[
    {
        "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.

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

1
user12551065 16 Янв 2020 в 01:34

2 ответа

Лучший ответ

Вам не нужно искать и обновлять документ пользователя, который выполняет два вызова БД плюс .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(), поскольку он возвращает обновленный пользовательский документ, который вам нужно отправить обратно.

1
srinivasy 15 Янв 2020 в 22:48

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

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

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

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

1
George Bailey 15 Янв 2020 в 22:50