2014-10-16 6 views
1

Мне интересно, если MongoDB имеет возможность сохранить объект с другим объектом (в той же схеме), что и его прототип. Например:Наследование прототипа MongoDB между сохраняемыми объектами

у нас есть объект в БД, как так

{ 
    name : 'foo', 
    lastName : 'bar', 
    email : '[email protected]' 
} 

Что я хотел бы сделать, это получить этот объект и обновлять электронную почту (например)

поэтому новый объект станет следующим:

{ 
    name: 'foo', 
    lastName : 'bar', 
    email : '[email protected]' 
} 

Как вы можете видеть, здесь есть дублированные данные (а именно свойства name и lastName).

Что я хотел бы сделать, это сохранить только и переформатирование так, то объект будет на электронный реквизите и Рефтинский исходный объект, как так

{ 
    email : '[email protected]', 
    __proto__ : originalObjectId //or whatever 
} 

Я знаю, что могу просто обновить объект, прямо или сохранить новую копию объекта, но я хотел бы иметь неизменность и не сохранять весь объект каждый раз, я хотел бы сохранить только diff от оригинала.

Возможна ли такая возможность из коробки (этим я имею в виду, поддерживает ли манго и оптимизирует такое)? (или через какую-нибудь библиотеку, такую ​​как мангуста или что-то в этом роде)

Или я должен сам ее реализовать?

Приветствия, Boogie

+0

можете ли вы назвать базу данных с наследованием? Сейчас мы говорим о дублировании данных для достижения оптимальной скорости. Вы пытаетесь свести к минимуму хранилище данных на диске. Можете ли вы представить, сколько прыжков пройти, если вы хотите получить полный объект. – wayne

+0

@wayne Объектно-реляционная база данных, такая как PostgreSQL, на самом деле делает это. – Martin

ответ

1

Это называется $set оператор, оператор обновления, направленные на только изменения указанных полей, так что вы не должны пройти весь объект по сети просто держать его:

db.collection.update(
    { "_id": idOfObjectOrOtherQuery }, 
    { "$set": { "email": "[email protected]" } 
) 

Так вот, как правило, обновления обновляются. Вместо того чтобы заменить весь документ, вы вместо этого используете update operator, чтобы просто изменить нужные вам детали.

MongoDB предлагает низкоуровневый интерфейс для операций по обновлению, в значительной степени, как показано на рисунке. Часть того, о чем вы, похоже, говорите, - это программный уровень поверх этого, чтобы сделать эти «отличные» решения для вас. Они известны как средства отображения объектных документов или решения ODM, аналог объектных реляционных Mappers или ORM.

Это не работа MongoDB, поскольку он должен быть lean и гибким. Задача обработки любого последующего взаимодействия считается делегированной библиотекам программного обеспечения, а не сервером. Таким образом, вы обнаружите, что некоторые библиотеки, такие как «mongoose», например, делают именно то, что было показано. Где, если вы изменяете объект, обнаруживается «дельта», и на сервер отправляются только изменения.

Таким образом, вы можете либо «изобретать колесо», что вы вполне можете сделать, либо взглянуть на решения, которые уже «построены поверх» технологий, которые используют базовые операции, как предусмотрено.

+0

Это не совсем то, что я имел в виду. Я хотел бы иметь неизменяемую базу данных. В принципе, обновления не будут только вставляться, и мне бы хотелось, чтобы опции не вставляли целую новую запись, а вставляли только различия между старым объектом и новым объектом. – boogie666

+0

@boogie Да, также несколько расплывчатый в том, как вы это задали. Больше информации, чтобы указать на то, что здесь происходит и что уже существует. Не работа MongoDB для этого. И этого не должно быть. Добавляет сложность. –

0

No MongoDB не поддерживает это, вам придется реализовать это самостоятельно.

Наследование - это особенность объектной системы, но MongoDB работает с документами, которые по совпадению используют объектную нотацию (BSON).