1

我正在尝试对我的数据库进行分片,但我遇到了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
}

谁能向我解释为什么这么说?或解决方案?在我看来,我正在做我需要做的一切。

4

2 回答 2

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

});

于 2012-10-19T23:57:15.483 回答
0

要扩展 ptyx 的答案:

findAndModify上的文档说,如果查询不包含分片键,分片集群将失败。由于您使用的是复合分片键,因此您可能需要在查询中包含所有三个字段。(见底部的红色段落)。

于 2012-10-21T06:36:11.143 回答