Удаление определенного поля, отвечающего определенным условиям, из объекта в коллекции

Я искал в Интернете возможные решения. По сути, необходимо удалить поле, если идентификатор объекта в массиве объектов соответствует определенному условию.

Как новичок в Mongodb, я не знаю, где именно искать соответствующие примеры.

Я хочу удалить объект с идентификатором = 0. Используемым языком будет Javascript.

Хотя не совсем уверен, как это сделать.

Посмотрите на картинку ниже. Красным цветом обозначен идентификатор, каждый зарегистрированный пользователь будет иметь свой идентификатор. У каждого пользователя будет корзина, связанная с его идентификатором. В корзине находится ProductsInCart -> Products, в которой есть такие поля, как идентификатор, цена и т. д.

Итак, что происходит, так это то, что выбирается идентификатор пользователя, а затем удаляется продукт (объект), где конкретный идентификатор продукта = 0. Идентификатор продукта показан стрелкой на рисунке, и я предполагаю, что объект, который нужно удалить, будет объектом с индексом = 0. также показано красной стрелкой. То же самое можно сделать с любым другим объектом с индексом 1 или 2 или где угодно.

Я пробовал использовать $pull, $unset и основы, найденные в Интернете, но дело в том, что для доступа к полю идентификатора продукта требуется очень специфическая команда, которую я не знаю, как написать ее на Javscript. В sql это будет что-то «Удалить объект», где идентификатор пользователя = новый ObjectId («66a35c99784aa722b15c9801») и идентификатор продукта = 0.

Можете ли вы поделиться образцом документа в mongoplayground.net/maybe

cmgchess 28.07.2024 14:48

@cmgchess не знаю, как это сделать. Должен ли я скопировать документ и вставить его туда?

chris1234 28.07.2024 15:14

@cmgchess mongoplayground.net/p/zliMzeZvHx6

chris1234 28.07.2024 15:25

есть ли причина, по которой тележки представляют собой массив. может ли оно содержать несколько { "productsInCart" : [...]}

cmgchess 28.07.2024 15:39

Этот вопрос похож на: MongoDB, удалить объект из массива. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

ray 28.07.2024 18:15

@ray К сожалению, с самого начала, как показано в документации и примерах, это не работает. Я думаю, это половина пути, возможно, это последний шаг из нескольких шагов, но я уже попробовал все это, прежде чем прийти сюда. Проблема здесь в том, что удаляемый объект глубоко вложен в объект корзины. Кроме того, у каждого зарегистрированного пользователя есть своя собственная корзина, поэтому ее Удалить продукт Где _id = _id: new ObjectId("66a35c99784aa722b15c9801") и id = 0 , поэтому это: корзина -->productsinCart -->product -->id. Теперь, как это сделать в Javascript, я, будучи новичком, застрял.

chris1234 28.07.2024 20:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Избегайте создания вложенных полей массива. Это считается антишаблоном и вносит ненужную сложность в запрос. Подумайте о том, чтобы сохранить только уровень 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
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Игровая площадка Монго

спасибо, Рэй, это помогло

chris1234 02.08.2024 12:16

Другие вопросы по теме