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,...) часами и не повезло.
Ответы
Ответ 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();