#mongodb
#mongodb
Вопрос:
Скажем, у меня есть коллекция MyCollection
с именем, содержащим только один документ и объект с именем MyObject
db.MyCollection.findOne()
{ _id: "23r3d2", xyz: "something", abc: "something else" }
MyObject
{ xyz: "lalala" }
Если вы сделаете:
db.MyCollection.update( db.MyCollection.findOne() , { $set: MyObject } )
В результате MyCollection
получается:
{ _id: "23r3d2", xyz: "lalala", abc: "something else" }
Что НЕ то же самое MyObject
, что и причина $set
в том, что будет:
- Установите значение ключа, если он уже есть.
- Добавьте новый ключ и значение, если ключ еще не существует.
Однако этого не произойдет,
- удалите ключи из коллекции, если поле не существует в объекте, который $set принимает в качестве аргумента.
Как бы вы закодировали его так, чтобы:
db.MyCollection.findOne()
{ _id: "23r3d2", xyz: "something", abc: "something else" }
стал бы:
db.MyCollection.findOne()
{ _id: "23r3d2", xyz: "lalala"}
как только вы поместите этот объект в качестве параметра где-нибудь:
MyObject
{ xyz: "lalala" }
Я хотел бы избежать необходимости явно определять поля для исключения.
Комментарии:
1. Просто возьмите set out, используйте только свой объект в обновлении
2. Во-первых, не вставляйте операторы. Также , если вы просто хотите заменить вещи, которые вы не используете
$set
. Простоdb.Collection.update({ _id: "23r3d2" }, MyObject)
который заменяет все по умолчанию.$set
существует по прямо противоположной причине, когда вы не хотите заменять все подряд.3. Ооо … понял. Спасибо всем!
4. @NeilLunn, что именно вы подразумеваете под «операторами встраивания»?
5. Я имею в виду, что не используйте
.findOne
в качестве способа получения документа для обновления «встроенного», поскольку вы получаете значения документа в отдельной строке. Это просто случайность, что оболочка оценивает таким образом. Не так работает mongodb
Ответ №1:
Просто сделайте:
db.myCollection.update(db.myCollection.findOne(), MyObject);
Он сохранит тот же _id, но заменит весь объект.
Кстати, если у вас есть только один элемент, вы можете выполнить поиск с помощью пустого запроса: {}
, вместо db.myCollection.findOne()
Ответ №2:
У меня возникают трудности с поиском варианта использования, когда вы хотели бы иметь коллекцию, содержащую один документ. То , что вы , вероятно , хотите , это findAndModify
, например:
db.collection.findAndModify({
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
});
Вот полная документация.