Удаление элемента массива в mongoDB в зависимости от положения элемента - PullRequest
4 голосов
/ 11 февраля 2011

На самом деле мне нужно удалить элемент из массива на основе его позиции. Используя $ pop, мы можем удалить элемент сверху или снизу (рассматривая его как стек. 0-й элемент сверху), как объяснено здесь .

Мы также можем удалить элемент из массива на основе значения элементов в массиве, используя $ pull, как объяснено здесь .

Но мне нужно удалить элемент из массива на основе позиции. Так есть ли способ сделать это.

Ответы [ 2 ]

7 голосов
/ 11 февраля 2011

Из документации:

{ $pull : { field : {$gt: 3} } } removes array elements greater than 3

Итак, я полагаю, что сейчас вы можете сделать что-то вроде этого:

{ $pull : { field : {$gt: 3, $lt: 5} } } // shoud remove elemet in 4 position 

Или попробовать обновить, используя оператор позиции ,Я полагаю, что-то вроде этого:

  { $pull : "field.4" } 

  { $pull : {"field.$": 4}}

Это всего лишь предложение, потому что я не могу проверить это прямо сейчас.

Обновление:

Кажется, вы не можете сделать это правильно, за один шаг (есть такая ошибка в jira )

Но вы можете удалить, используя unset элемент в позиции, и который вытягивает элементы с нулевым значением:

{$unset : {"array.4" : 1 }}
{$pull : {"array" : null}}
0 голосов
/ 14 марта 2013

Вот ваш ответ Элемент массива MongoDB pull из коллекции

Чтобы сначала удалить конкретный элемент из массива какого-либо документа, необходимо идентифицировать этот элемент.Например, у меня есть документ с массивом, и каждый элемент этого массива является объектом:

`{
    "_id" : ObjectId("5140f34888dd50971900002d"),
    "_permissions" : {
        "edit" : [
            {
                "profile_id" : NumberLong(123),
                "comment" : "app/project owner"
            },
            {
                "profile_id" : NumberLong("153579099841888257"),
                "comment" : "project admin"
            },
            {
                "profile_id" : NumberLong("153579095869882369"),
                "comment" : "project admin"
            }
        ],
        "view" : [
            {
                "profile_id" : NumberLong(123),
                "comment" : "app/project owner"
            },
            {
                "profile_id" : NumberLong("153579099841888257"),
                "comment" : "project admin"
            },
            {
                "profile_id" : NumberLong("153579095869882369"),
                "comment" : "project admin"
            }
        ]
    }
}`

Так что давайте удалим «profile_id» со значением «153579099841888257» из массива «_permissions.view».Здесь мы идем

`db.collection.update({_id: ObjectId("5140f34888dd50971900002d")}, {$pull:{"_permissions.view": {"profile_id": NumberLong("153579099841888257")}}});`
  1. Я определяю область объекта (чтобы убедиться, что идентификатор не влияет на любой другой первый найденный документ)
  2. Определите необходимый элемент для извлечения: "profile_id "со значением" 153579099841888257 "в массиве" _permissions.view "
...