Эквивалент метеора

Как скоро команда upsert будет реализована в Meteor?

И как лучше всего сделать то же самое в то же время?

Что-то вроде этого, что я делаю в данный момент:

if typeof ( item = Items.findOne({title:'Foo'}) ) == 'undefined'
    item = Items.insert({title:'Foo'})
else
    Items.update(item._id, {$set: {title:'Foo'}})
# do something with item

person tom    schedule 03.11.2012    source источник
comment
В вашем решении обратите внимание, что если два отдельных клиента выполняют findOne() одновременно, то будут созданы два документа с {title:'Foo'}.   -  person J Rassi    schedule 07.11.2012
comment
Правда, тогда идеальной была бы метеорная реализация upsert. Поскольку, если два клиента запускают upsert с одними и теми же данными, они создают отдельные документы в смоделированной клиентской базе данных; тогда метеор будет синхронизировать два документа, когда они запускаются на сервере. Однако это может показаться немного запутанным... Я понимаю, почему это еще не реализовано.   -  person tom    schedule 12.11.2012


Ответы (3)


Как скоро команда upsert будет реализована в Meteor?

ОБНОВЛЕНИЕ: @Thomas4019 указывает, что теперь поддерживается upsert:

v0.6.6

«Добавить поддержку upsert. Collection.update теперь поддерживает параметр {upsert: true}. Кроме того, добавьте метод Collection.upsert, который возвращает идентификатор вновь вставленного объекта, если это применимо».

Источник: History.md

Документация по использованию: http://docs.meteor.com/#upsert.

-- исходный ответ следует --

В дорожной карте Trello Meteor есть карточка, за которую вы можете проголосовать, чтобы указать ее важность для вас: https://trello.com/c/C91INHmj

В настоящее время он находится в списке «Позже», что означает, что пройдет некоторое время, прежде чем он будет реализован, если он не получит много голосов.

Еще одна важная вещь, которую следует отметить, это то, что, поскольку у метеора открытый исходный код, вы можете внести необходимые изменения самостоятельно и отправить обратно.


Каков наилучший способ сделать то же самое в то же время?

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

  1. Используйте код как есть, добавьте уникальный индекс в коллекцию и обработайте ошибку дублирования ключа, если/когда она возникает.

  2. Измените дизайн, чтобы реализовать явный оптимистичный параллелизм.

Ядро обоих этих решений одинаково, изящно обрабатывайте случай ошибки. №1 легче реализовать. № 2 обеспечивает большую гибкость при обработке оптимистичного параллелизма.

person alanning    schedule 14.01.2013
comment
Функция Upsert теперь встроена. - person Thomas4019; 21.12.2013

Если вы действительно хотите это сделать, вы можете напрямую использовать соединение mongodb: MongoInternals.defaultRemoteCollectionDriver().mongo.db.collection('myCollection').update(query, update, {upsert: true}). Конечно, это подключение не задокументировано, поэтому есть шанс, что его можно будет изменить в будущем.

person lastid    schedule 22.09.2013

Upsert действительно легко с этим трюком. вы просто проверяете, есть ли у него свойство _id:

if(item._id){
  //update
}else{
  //insert
}
person user3413723    schedule 26.03.2016