summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2013-03-22 13:22:42 -0400
committerDan Pasette <dan@10gen.com>2013-03-28 18:51:19 -0400
commitd1421e517c41af36cd756f591b913e3c2b3fed76 (patch)
tree35f6a0737c6911182882bf9d291721f37138eb31
parentf1f70fbe0b515e7d868db0815cec822ae5515966 (diff)
downloadmongo-d1421e517c41af36cd756f591b913e3c2b3fed76.tar.gz
SERVER-9027: allow dbref shard keys
-rw-r--r--src/mongo/s/shardkey.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/mongo/s/shardkey.cpp b/src/mongo/s/shardkey.cpp
index 8b768c0e8dd..c81daff902c 100644
--- a/src/mongo/s/shardkey.cpp
+++ b/src/mongo/s/shardkey.cpp
@@ -59,8 +59,10 @@ namespace mongo {
for(set<string>::const_iterator it = patternfields.begin(); it != patternfields.end(); ++it) {
BSONElement e = obj.getFieldDotted(it->c_str());
- if(e.eoo() || e.type() == Array || (e.type() == Object && e.embeddedObject().firstElementFieldName()[0] == '$')) {
- // cant use getGtLtOp here as it returns Equality for unknown $ops and we want to reject them
+ if( e.eoo() ||
+ e.type() == Array ||
+ (e.type() == Object && !e.embeddedObject().okForStorage())) {
+ // Don't allow anything for a shard key we can't store -- like $gt/$lt ops
return false;
}
}
@@ -145,16 +147,26 @@ namespace mongo {
public:
void hasshardkeytest() {
- BSONObj x = fromjson("{ zid : \"abcdefg\", num: 1.0, name: \"eliot\" }");
ShardKeyPattern k( BSON( "num" << 1 ) );
+
+ BSONObj x = fromjson("{ zid : \"abcdefg\", num: 1.0, name: \"eliot\" }");
verify( k.hasShardKey(x) );
verify( !k.hasShardKey( fromjson("{foo:'a'}") ) );
verify( !k.hasShardKey( fromjson("{x: {$gt: 1}}") ) );
+ verify( !k.hasShardKey( fromjson("{num: {$gt: 1}}") ) );
+ BSONObj obj = BSON( "num" << BSON( "$ref" << "coll" << "$id" << 1));
+ verify( k.hasShardKey(obj));
// try compound key
{
ShardKeyPattern k( fromjson("{a:1,b:-1,c:1}") );
verify( k.hasShardKey( fromjson("{foo:'a',a:'b',c:'z',b:9,k:99}") ) );
+ BSONObj obj = BSON( "foo" << "a" <<
+ "a" << BSON("$ref" << "coll" << "$id" << 1) <<
+ "c" << 1 << "b" << 9 << "k" << 99 );
+ verify( k.hasShardKey( obj ) );
+ verify( !k.hasShardKey( fromjson("{foo:'a',a:[1,2],c:'z',b:9,k:99}") ) );
+ verify( !k.hasShardKey( fromjson("{foo:'a',a:{$gt:1},c:'z',b:9,k:99}") ) );
verify( !k.hasShardKey( fromjson("{foo:'a',a:'b',c:'z',bb:9,k:99}") ) );
verify( !k.hasShardKey( fromjson("{k:99}") ) );
}
@@ -164,7 +176,16 @@ namespace mongo {
ShardKeyPattern k( fromjson("{'a.b':1}") );
verify( k.hasShardKey( fromjson("{a:{b:1,c:1},d:1}") ) );
verify( k.hasShardKey( fromjson("{'a.b':1}") ) );
+ BSONObj obj = BSON( "c" << "a" <<
+ "a" << BSON("$ref" << "coll" << "$id" << 1) );
+ verify( !k.hasShardKey( obj ) );
+ obj = BSON( "c" << "a" <<
+ "a" << BSON( "b" << BSON("$ref" << "coll" << "$id" << 1) <<
+ "c" << 1));
+ verify( k.hasShardKey( obj ) );
verify( !k.hasShardKey( fromjson("{'a.c':1}") ) );
+ verify( !k.hasShardKey( fromjson("{'a':[{b:1}, {c:1}]}") ) );
+ verify( !k.hasShardKey( fromjson("{a:{b:[1,2]},d:1}") ) );
verify( !k.hasShardKey( fromjson("{a:{c:1},d:1}") ) );
verify( !k.hasShardKey( fromjson("{a:1}") ) );
verify( !k.hasShardKey( fromjson("{b:1}") ) );