2014-05-11 22 views
8

Tôi đang cố chèn một số dữ liệu vào MongoDB bằng Go.Chèn dữ liệu vào MongoDB bằng mgo

Dưới đây là các cấu trúc dữ liệu:

type Entry struct { 
    Id   string `json:"id",bson:"_id,omitempty"` 
    ResourceId int `json:"resource_id,bson:"resource_id"` 
    Word  string `json:"word",bson:"word"` 
    Meaning  string `json:"meaning",bson:"meaning"` 
    Example  string `json:"example",bson:"example"` 
} 

Đây là chức năng chèn của tôi:

func insertEntry(db *mgo.Session, entry *Entry) error { 
    c := db.DB(*mongoDB).C("entries") 
    count, err := c.Find(bson.M{"resourceid": entry.ResourceId}).Limit(1).Count() 
    if err != nil { 
     return err 
    } 
    if count > 0 { 
     return fmt.Errorf("resource %s already exists", entry.ResourceId) 
    } 
    return c.Insert(entry) 
} 

Và cuối cùng, đây là cách tôi gọi nó là:

entry := &Entry{ 
    ResourceId: resourceId, 
    Word:  word, 
    Meaning:  meaning, 
    Example:  example, 
} 
err = insertEntry(db, entry) 
if err != nil { 
    log.Println("Could not save the entry to MongoDB:", err) 
} 

Vấn đề là , Tôi đã mong đợi các thẻ bson của mình hoạt động một cách kỳ diệu, nhưng chúng không hoạt động. Thay vì dữ liệu được lưu lại dưới dạng:

{ "_id": ObjectId ("53700d9cd83e146623e6bfb4"), "RESOURCE_ID": 7.660.708, "chữ": "Foo" ...}

nó được lưu lại dưới dạng:

{ "_id": ObjectId ("53700d9cd83e146623e6bfb4"), "id": "", "RESOURCEID": 7.660.708, "chữ": "Foo" ...}

Làm cách nào để khắc phục sự cố này?

Trả lời

11

Change nhập cảnh vào:

type Entry struct { 
    Id   string `json:"id" bson:"_id,omitempty"` 
    ResourceId int `json:"resource_id" bson:"resource_id"` 
    Word  string `json:"word" bson:"word"` 
    Meaning  string `json:"meaning" bson:"meaning"` 
    Example  string `json:"example" bson:"example"` 
} 

Cú pháp cho Struct Thẻ không sử dụng dấu phẩy giữa các thẻ. Tôi tin rằng điều này nên sửa chữa nó.

+0

điều này là sai. Id không chỉ cần phải thuộc loại bson.ObjectId mà các thẻ bson không cần thiết ngoại trừ ResourceId không nhận được tự động chuyển thành "resource_id". Các trường cấu trúc chữ hoa bị hạ thấp bởi mgo. Chỉ cần tên trường chữ thường json. –

+1

@dalu _id thực sự có thể thuộc bất kỳ loại nào. Chỉnh sửa: Vâng, trừ khi OP đã mong đợi một ObjectId, mà không phải là hoàn toàn rõ ràng từ câu hỏi. –

+0

@dalu như Gustavo đã nói, _id không cần phải là một ObjectId, Đó là mặc định, nhưng không phải lúc nào cũng là sự lựa chọn cần thiết. Ngoài ra, không có gì là sai. Cá nhân tôi nghĩ rằng bao gồm các thẻ cấu trúc bson là thực hành tốt hơn trong thời gian dài ngay cả khi nó là như nhau. Hãy tưởng tượng nếu một dev tương lai xuất hiện và quyết định thay đổi biến "Word" thành "Title". Không định nghĩa thẻ bson, chúng sẽ thay đổi kho dữ liệu mà không nhận ra nó. Giữ một thẻ bson giúp duy trì IMO dòng và tồi tệ hơn, làm cho bạn gõ một vài ký tự cho rõ ràng. – TrevorSStone

7
type Entry struct { 
    Id   bson.ObjectId `bson:"_id,omitempty" json:"id"` 
    ResourceId int   `json:"resource_id" bson:"resource_id"` 
    Word  string  `json:"word"` 
    Meaning  string  `json:"meaning"` 
    Example  string  `json:"example"` 
} 

Thay vì Đếm() và Chèn(), bạn có thể sử dụng UpsertId thực hiện điều đó, nếu một Id tồn tại bản ghi được thay thế nếu không được chèn.

Chèn() với một đối tượng rỗng cho phép MongoDB xử lý gán Id.

Chỉnh sửa: Đọc sai truy vấn Count của bạn. Bạn cũng gặp lỗi trong đó. Phải là "resource_id" không phải "resourceid" bởi vì bạn đã tuyên bố rằng trường bson có tên "resource_id"

+0

Cách thức hoạt động của 'insertEntry' có vẻ phản trực giác, nhưng nó có ý nghĩa trong cách chương trình hoạt động. –

+0

có, đã sửa chữa điều đó. Tôi nghĩ bạn đang kiểm tra nếu một objectId tồn tại sau đó chèn một bản ghi mới. –

+1

wtf đó là câu trả lời đúng. Id cần phải là bson.ObjectId –

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