Как бы вы синхронизировали документ Mongo с объектом?

#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 в том, что будет:

  1. Установите значение ключа, если он уже есть.
  2. Добавьте новый ключ и значение, если ключ еще не существует.

Однако этого не произойдет,

  1. удалите ключи из коллекции, если поле не существует в объекте, который $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>
});
 

Вот полная документация.