我有一个超过65k块的3-shard集合。我如何从此集合中获取驻留在特定块中的文档,并记住我的分片键是一个散列索引?
例如,我的一个块(来自foreach ($users as $user) {
$data = ['user' => $user];
$this->mailer->queue($views, $data, function($message) use($user) {
$message->to($user->email, $user->name);
});
}
集合的文档)看起来像这样:
chunks
如何按{
"_id" : "foo.bar-x_1947951600265057904",
"lastmod" : Timestamp(1, 0),
"lastmodEpoch" : ObjectId("57910236c0b70d5ea7025479"),
"ns" : "foo.bar",
"min" : {
"x" : NumberLong("123") <-- this is a hashed value of a string field `x`
},
"max" : {
"x" : NumberLong("987") <-- this is a hashed value of a string field `x`
},
"shard" : "shard0000"
}
foo.bar
查询min/max
这是一个常规字符串?我试过了:
x
但它会返回db.bar.find({x:{$gte: NumberLong('123'), $lte: NumberLong('987')}}).count()
答案 0 :(得分:0)
您需要正确访问子文档,即键入min.x
和max.x
。此外,您必须使用$and
绑定条件,因为它们现在是单独的条件。我输入了以下查询并且有效:
db.bar.find({
$and:[
'min.x': {
$gte: NumberLong('123')
},
'max.x': {
$lte: NumberLong('987')
}
]
}).count()
您的初始查询返回0,因为没有与x
匹配的文档条目。
请注意,我不使用任何分片集合。我只是创建了一个新的集合并插入了你给出的例子。 我希望这有帮助!