2012-10-19 119 views
0

我試圖分片我的數據庫,但我有一個問題與findAndModifyMongoDB的分片findAndModify

我有一個模式,它看起來像這樣(myCollection)將:我設置

{ 
    "_id": "508206a9f6ded00c50f59469" 
    "DatabaseId" : 91, 
    "TypeId" : "5e62603c-8", 
    "ItemId" : "734", 
    "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
} 

我shardkey這樣的:

db.runCommand({enablesharding:"myDb"}); 
db.runCommand({ 
    shardcollection: "myDb.myCollection", 
    key: { 
     "DatabaseId" : 1, 
     "TypeId" : 1, 
     "ItemId" : 1 
    } 
}); 

比方說架構上面插入到數據庫中。

現在我運行此查詢:

db.myCollection.findAndModify({ 
    query: { 
     "DatabaseId" : 91, 
     "TypeId" : "5e62603c-8", 
     "ItemId" : "734", 
     "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
    }, 
    remove: true 
}); 

我從運行findAndModify得到這個錯誤:

findAndModifyFailed failed: { 
    "errmsg" : "exception: query for sharded findAndModify must have shardkey", 
    "code" : 13343, 
    "ok" : 0 
} 

爲什麼它說這個任何人都可以解釋一下嗎?或爲它的解決方案?在我看來,我正在做我需要的一切。

回答

2

你的分片鍵有3個字段:databaseId,typeId和itemId。

Mongo告訴你,你不能只用databaseId做findAndModify。我不知道爲什麼。

你需要的東西,如:

db.myCollection.findAndModify({ 
query: { 
    "DatabaseId" : 91, 
    "TypeId": "blah", 
    "itemId": "foo" 
    "GroupId" : "5e62603c-8", 
    "Identifier" : "734", 
    "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
}, 
remove: true 

});

+0

對不起,GroupId和Identifier == TypeId和ItemId。我在我的問題上做了改變。 – ehftwelve

+1

根據:http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/#sharded-collections「在分片環境中使用findAndModify時,查詢必須包含針對所有操作的分片鍵分片集合的分片集羣「。 – Sebastian

0

要擴大ptyx的回答是:

上findAndModify的docs說,它將爲分片集羣失敗,如果查詢不包含片鍵。由於您正在使用複合分片鍵,因此您可能需要在查詢中包含所有三個字段。 (請參閱底部的紅色段落)。

+0

我錯寫了我的問題。對不起。我在findAndRemove查詢中使用了所有這三個 – ehftwelve