2012-04-08 38 views
11

Làm thế nào có thể làm điều này với Mongo trong một [nguyên tử] tuyên bố:MongoDB: chèn vào cập nhật khóa trùng lặp

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

Khi tuyên bố này được thực hiện lần đầu tiên nó sẽ thiết lập giá trị X nhưng sau đó nó sẽ chỉ cập nhật Giá trị Y.

Chỉ MyUniqueKey là một phần của khóa duy nhất và nên được tra cứu để sao y.

Trả lời

5

Tôi đã hỏi câu hỏi này trên nhóm người dùng mongodb, câu trả lời là không thể và đây là một mở issue.

+4

Sự cố này đã bị đóng trong MongoDB 2.4 và bây giờ bạn có thể sử dụng ['$ setOnInsert'] (http://docs.mongodb.org/manual/reference/operator/setOnInsert /). – str

14

Bạn đang tìm kiếm upsert option trên lệnh Update. Các tài liệu phải đủ ở đây.

+0

bạn vui lòng đưa ra một ví dụ. Tôi đã thử nhiều kết hợp các tùy chọn, nhưng tôi không thể chọn một trường được đặt trên chèn nhưng bị loại trừ khi cập nhật. –

+0

có một trường tôi muốn được đặt chỉ khi chèn đầu tiên nhưng vẫn không được chạm vào các bản cập nhật. –

+0

Bạn phải tạo phần 'Y' của phần' truy vấn' của bản cập nhật thay vì một phần của phần 'cập nhật'. –

1

Từ

$setOnInsert

tôi sẽ gọi nó là "MyCollection" thay vì "mytable". Bạn có thể làm như sau:

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

Về cơ bản các bộ $ chạy luôn, trừ khi tài liệu không tồn tại. Sau đó, $ setOnInsert sẽ chạy.

Các vấn đề liên quan