Подтвердить что ты не робот

Mongoose удаляет (вытягивает) документ внутри массива, не работает с ObjectID

У меня есть следующая схема мангуста:

user = {
    "userId" : "myId",
    "connections":
    [{
        "dateConnectedUnix": 1334567891,
        "isActive": true
    }, {
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

Я хотел бы удалить второй элемент в массиве connections, чтобы получить следующее:

user = {
    "userId" : "myId",
    "connections": 
    [{
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

Следующий код выполняет задание как ожидалось:

userAccounts.update({'connections.isActive': false }, 
                    {$pull: { 'connections.isActive':false }}, 
                    function (err,val) {
                        console.log(val)
                    });

Но мне нужно удалить на основе ObjectId. И следующее не работает:

userAccounts.update({'connections._id': '1234-someId-6789' }, 
                    {$pull: { 'connections._id': '1234-someId-6789' }}, 
                    function (err,val) {
                        console.log(val)
                    });

Любые предложения? Я часами стучал головой о экран (ака Google, Stackoverflow,...) часами и не повезло.

4b9b3361

Ответ 1

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

В конце концов, я получил этот ответ здесь: MongoDB, удалить объект из массива

Вот мой рабочий код:

userAccounts.update( 
      { userId: usr.userId },
      { $pull: { connections : { _id : connId } } },
      { safe: true },
      function removeConnectionsCB(err, obj) {
          ...
      });

Ответ 2

У меня есть документ вроде

введите описание изображения здесь

Мне нужно удалить адрес из массива адресов

После поиска лотов в Интернете я нашел решение

 Customer.findOneAndUpdate(query, {$pull: {address: addressId}}, function(err, data){
        if(err) {
          return res.status(500).json({'error' : 'error in deleting address'});
        }

        res.json(data);

      });

Ответ 3

Чтобы использовать обновление с ObjectId, вы должны использовать объект ObjectId вместо строкового представления:

var ObjectId = require('mongoose').Types.ObjectId;

userAccounts.update({'connections._id': new ObjectId('1234-someId-6789') }, 
                {$pull: { 'connections._id': new ObjectId('1234-someId-6789') }}, 
                function (err,val) {
                    console.log(val)
                });

Ответ 4

mongoose: 4.11.11
Для меня работал следующий синтаксис:

const removeTansactionFromUser = (userId, connectionId) => {
    return User.findByIdAndUpdate(userId, { $pull: { "connections": connectionId} }, {'new': true} );
};

Идентификатор поддержки Mongoose в строковом формате или формате ObjectId.
Совет: new ObjectId(stringId) для переключения с строки на ObjectId

Ответ 5

Вы можете сделать это в mongoose 5.4.x

const result = await User.findByIdAndUpdate(user_id,
            {
                $pull: {
                    connections: { _id: con_id }
                }
            }, { new: true });


if (result)
    console.log(result)

item из массива connections будет удален на основе предоставленного значения свойства _id

Ответ 6

user: {
 _id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
 name: 'Test',
 posts: [
  ObjectId("5cd07ee05c08f51af8d23b64"),
  ObjectId("5cd07ee05c08f51af8d23c52")
 ]
}

Удалить один пост из массива постов

user.posts.pull("5cd07ee05c08f51af8d23b64"); user.save();