Mongodb $unset оставляет пустой объект массива (javascript)

Я использую команду mongo «$unset», чтобы удалить все соответствующие документы по определенным критериям, где индекс неизвестен.

Допустим, коллекция выглядит так: -

{
    "_id" : 1,
    "list" : [
        {
            "key" : "a"
        },
        {
            "key" : "b"
        },
        {
            "key" : "c"
        }
    ]
}

Команда оболочки Mongo, используемая для сброса ключей, соответствующих "b":-

db.test.update({"list.key":"b"}, {$unset: {'list.$.key':"b"}})

Результат:-

{
    "_id" : 1,
    "list" : [ {"key" : "a"}, {}, {"key" : "c"} ]
}

Ответ необходим для: - Как удалить пустой объект массива?

Примечание. Я читал страницы, предлагающие использовать $pull:null, но здесь это не подходит.

Спасибо!


person user3601166    schedule 04.05.2014    source источник


Ответы (1)


Если вы действительно хотите сначала unset , а затем вытащить недостающие элементы key из массива, используйте:

db.test.update(
  { "_id": 1 },  // you can also use { } to clean up the whole collection
  { $pull: { "list": { "key": {$exists: false} } } }
)

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

db.test.insert({ 
  "_id" : 1, 
  "list" : [ { "key": "a" }, { "key": "b" }, { "key": "c" } ] 
})

Вы можете использовать pull для удаления из документа, где list содержит key со значением b:

db.test.update({ 
  "list.key": "b" }, 
  { $pull: { "list": {"key": "b" } } 
})

Это удаляет соответствующий элемент из массива:

db.test.find()
{ "_id" : 1, "list" : [ { "key" : "a" }, { "key" : "c" } ] }
person Sebastian    schedule 04.05.2014
comment
Большое спасибо! Оба способа сработали для меня, я бы предпочел прямой $pull для одной меньшей операции. - person user3601166; 04.05.2014