Я полагаю, вы хотите удалить данные из массива следующим образом:
{
"field" : "aaa",
"list" : [ "aaa", NumberLong(123), "bbb", NumberLong(456) ]
}
Вы можете сделать это, используя $pull
, так как он принимает выражение запроса, поскольку оно аргумент
db.collection.update({ },{ "$pull": { "list": {"$type": 18 } } })
Редактировать
Поскольку вопрос изменился, он по-прежнему мало что меняет в ответе:
{
"list" : [
{ "key" : "val" },
{ "key" : NumberLong(100) },
{ "key" : NumberLong(123) }
]
}
И в основном с тем же запросом:
db.list.update({ }, { "$pull": { "list": { "key": {"$type": 18 } } } })
Затем все типы NumberLong()
удаляются.
Добавьте { "multi": true }
там, где вы хотите, чтобы это происходило в нескольких документах.
Таким образом, используется $type
для сопоставления элементов "NumberLong", которые являются 64-битными целыми числами. Значения для каждого «типа» указаны на странице руководства.
Оператор positional $
здесь не подходит, так как:
Это не допустимый аргумент для чего-либо, что можно использовать для удаления элементов.
Даже при использовании с $set
и последующей "установке" значения false
, вам будет соответствовать только первый элемент, соответствующий массиву. В любом случае вы не удаляете элемент, и вам все равно нужно будет использовать pull.
Кроме того, в вашем методе JavaScript typeof()
, который вы ищете, не вернет ничего, кроме object
, что и является реализацией JavaScript. Вам придется проверить по-другому.
Но не надо. наилучшим способом является использование собственных методов обновления.
person
Neil Lunn
schedule
22.03.2014