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

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

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

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

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

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

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

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

🤔 А знаете ли вы, что...
С JavaScript можно создавать расширения для различных платформ, таких как Adobe Acrobat и Microsoft Office.


2
57
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
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

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