2012-04-08 2 views
11

Как можно сделать это с Монго в одном [атомном] заявление:MongoDB: вставка на дубликат ключа обновления

insert mytable set MyUniqueKey = ?, X = ? on duplicate key update Y = ? 

При выполнении этого оператора в первый раз он будет устанавливать значение X, но после того, что он будет только обновить Y.

Только MyUniqueKey является частью уникального ключа и должен искать дубликаты.

ответ

5

Я задал этот вопрос в группе пользователей mongodb, ответ был тот, что это невозможно, и это открытый issue.

+4

Эта проблема была закрыта в MongoDB 2.4, и теперь вы можете использовать ['$ setOnInsert'] (http://docs.mongodb.org/manual/reference/operator/setOnInsert /). – str

14

Вы ищете upsert option на команде Update. Документов должно быть достаточно.

+0

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

+0

есть поле, которое мне нравится устанавливать только на первой вставке, но не тронуты обновлениями. –

+0

Вы должны сделать 'Y' частью части запроса, а не частью части« update ». –

1

От

$setOnInsert

Я бы назвал это "MyCollection" вместо "туЬаЫе". Вы можете сделать следующее:

db.mycollection.update(
    { MyUniqueKey: "?" }, 
    { 
     $set: {"y": "?"}, 
     $setOnInsert: { 
      MyUniqueKey: "?", 
      "x": "?", 
    }, 
    { upsert: true } 
) 

В принципе $ набор работает всегда, кроме случаев, когда документ не существует. Затем запустится $ setOnInsert.

 Смежные вопросы

  • Нет связанных вопросов^_^