我正在尝试分割我的数据库,但是我对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
}有人能向我解释一下为什么会这样说吗?或者解决这个问题?在我看来,我正在做我需要做的一切。
发布于 2012-10-19 23:57:15
您的碎片密钥有三个字段: databaseId、typeId和itemId。
Mongo告诉你,你不能只用findAndModify做databaseId。我也不知道原因。
你需要这样的东西:
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-21 06:36:11
关于ptyx的回答是:
文档 on findAndModify表示,如果查询不包含碎片键,它将失败。由于您使用的是复合碎片键,因此可能需要在查询中包含所有三个字段。(见底部的红色段落)。
https://stackoverflow.com/questions/12983162
复制相似问题