有没有办法使用MongoDb(2.2)C ++驱动程序创建sparse索引?
似乎ensureIndex
函数不接受这个参数。来自MongoDb docs:
bool mongo::DBClientWithCommands::ensureIndex(
const string & ns,
BSONObj keys,
bool unique = false,
const string & name = "",
bool cache = true,
bool background = false,
int v = -1)
答案 0 :(得分:2)
就此而言,dropDups
也不是一个论点......
作为一种变通方法,您可以自己构建服务器命令并附加sparse
参数。如果您遵循this link,您会注意到服务器命令包含构建BSONObject
并且各种索引选项作为字段附加。编写自己的ensureIndex
版本应该很简单。
答案 1 :(得分:0)
我最终修补了Mongo源代码(mongo/cleint/dbclient.cpp
):
bool DBClientWithCommands::ensureIndex( const string &ns , BSONObj keys , bool unique, const string & name , bool cache, bool background, int version, bool sparse ) {
BSONObjBuilder toSave;
toSave.append( "ns" , ns );
toSave.append( "key" , keys );
string cacheKey(ns);
cacheKey += "--";
if ( name != "" ) {
toSave.append( "name" , name );
cacheKey += name;
}
else {
string nn = genIndexName( keys );
toSave.append( "name" , nn );
cacheKey += nn;
}
if( version >= 0 )
toSave.append("v", version);
if ( unique )
toSave.appendBool( "unique", unique );
if ( sparse )
toSave.appendBool( "sparse", true );
if( background )
toSave.appendBool( "background", true );
if ( _seenIndexes.count( cacheKey ) )
return 0;
if ( cache )
_seenIndexes.insert( cacheKey );
insert( Namespace( ns.c_str() ).getSisterNS( "system.indexes" ).c_str() , toSave.obj() );
return 1;
}
问题应该是版本2.3.2中的resolved