1

データベースをシャーディングしようとしていますが、findAndModifyに問題があります

私はこのようなスキーマを持っています(myCollection):

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

シャードキーを次のように設定しています。

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
}

なぜそれがこれを言っているのか誰かが私に説明できますか?またはそれに対する解決策?私は必要なことはすべてやっているように思えます。

4

2 に答える 2

2

シャード キーには、databaseId、typeId、itemId の 3 つのフィールドがあります。

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

});

于 2012-10-19T23:57:15.483 に答える
0

ptyxの答えを拡張するには:

findAndModifyのドキュメントによると、クエリにシャードキーが含まれていない場合、シャードクラスターでは失敗します。複合シャードキーを使用しているため、クエリに3つのフィールドすべてを含める必要がある場合があります。(下部の赤い段落を参照してください)。

于 2012-10-21T06:36:11.143 に答える