Я искал в Интернете возможные решения. По сути, необходимо удалить поле, если идентификатор объекта в массиве объектов соответствует определенному условию.
Как новичок в Mongodb, я не знаю, где именно искать соответствующие примеры.
Я хочу удалить объект с идентификатором = 0. Используемым языком будет Javascript.
Хотя не совсем уверен, как это сделать.
Посмотрите на картинку ниже. Красным цветом обозначен идентификатор, каждый зарегистрированный пользователь будет иметь свой идентификатор. У каждого пользователя будет корзина, связанная с его идентификатором. В корзине находится ProductsInCart -> Products, в которой есть такие поля, как идентификатор, цена и т. д.
Итак, что происходит, так это то, что выбирается идентификатор пользователя, а затем удаляется продукт (объект), где конкретный идентификатор продукта = 0. Идентификатор продукта показан стрелкой на рисунке, и я предполагаю, что объект, который нужно удалить, будет объектом с индексом = 0. также показано красной стрелкой. То же самое можно сделать с любым другим объектом с индексом 1 или 2 или где угодно.
Я пробовал использовать $pull, $unset и основы, найденные в Интернете, но дело в том, что для доступа к полю идентификатора продукта требуется очень специфическая команда, которую я не знаю, как написать ее на Javscript. В sql это будет что-то «Удалить объект», где идентификатор пользователя = новый ObjectId («66a35c99784aa722b15c9801») и идентификатор продукта = 0.
@cmgchess не знаю, как это сделать. Должен ли я скопировать документ и вставить его туда?
@cmgchess mongoplayground.net/p/zliMzeZvHx6
есть ли причина, по которой тележки представляют собой массив. может ли оно содержать несколько { "productsInCart" : [...]}
Этот вопрос похож на: MongoDB, удалить объект из массива. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
@ray К сожалению, с самого начала, как показано в документации и примерах, это не работает. Я думаю, это половина пути, возможно, это последний шаг из нескольких шагов, но я уже попробовал все это, прежде чем прийти сюда. Проблема здесь в том, что удаляемый объект глубоко вложен в объект корзины. Кроме того, у каждого зарегистрированного пользователя есть своя собственная корзина, поэтому ее Удалить продукт Где _id = _id: new ObjectId("66a35c99784aa722b15c9801") и id = 0 , поэтому это: корзина -->productsinCart -->product -->id. Теперь, как это сделать в Javascript, я, будучи новичком, застрял.
Избегайте создания вложенных полей массива. Это считается антишаблоном и вносит ненужную сложность в запрос. Подумайте о том, чтобы сохранить только уровень cart
.
[
{
...,
"cart": [
{
"product": {
"id": 0,
"name": "iPad 11inch",
"imageUrl": "./images/ipad.jpg",
"title": "Apples",
"description": "Apples are <span class=\"label label-info\">25 CHF each</span>",
"price": 25
},
"quantity": 2
},
...
]
}
]
Вы можете упростить запрос следующим образом:
db.collection.update({
"cart.product.id": 0
},
{
"$pull": {
"cart": {
"product.id": 0
}
}
})
Если вам нужно придерживаться текущей схемы, вам понадобится сложный конвейер агрегации. Вам нужно перебрать массив cart
с помощью $map
, а затем использовать $filter
для перебора массива productsInCart
для выполнения фильтра. Наконец, используйте $mergeObjects
, чтобы обновить результат обратно до уровня cart
.
db.collection.update({
"cart.productsInCart.product.id": 0
},
[
{
"$set": {
"cart": {
"$map": {
"input": "$cart",
"as": "c",
"in": {
"$mergeObjects": [
"$$c",
{
"productsInCart": {
"$filter": {
"input": "$$c.productsInCart",
"as": "p",
"cond": {
"$ne": [
"$$p.product.id",
0
]
}
}
}
}
]
}
}
}
}
}
])
спасибо, Рэй, это помогло
Можете ли вы поделиться образцом документа в mongoplayground.net/maybe