本文整理汇总了C++中BSONElement::fieldName方法的典型用法代码示例。如果您正苦于以下问题:C++ BSONElement::fieldName方法的具体用法?C++ BSONElement::fieldName怎么用?C++ BSONElement::fieldName使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BSONElement
的用法示例。
在下文中一共展示了BSONElement::fieldName方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: buildNode
INT32 aggrProjectParser::buildNode( const BSONElement &elem,
const CHAR *pCLName,
qgmOptiTreeNode *&pNode,
_qgmPtrTable *pTable,
_qgmParamTable *pParamTable )
{
INT32 rc = SDB_OK;
BOOLEAN hasFunc = FALSE;
BSONObj obj;
qgmOptiSelect *pSelect = SDB_OSS_NEW qgmOptiSelect( pTable, pParamTable );
PD_CHECK( pSelect!=NULL, SDB_OOM, error, PDERROR,
"malloc failed" );
PD_CHECK( elem.type() == Object, SDB_INVALIDARG, error, PDERROR,
"failed to parse the parameter:%s(type=%d, expectType=%d)",
elem.fieldName(), elem.type(), Object );
try
{
obj = elem.embeddedObject();
{
PD_CHECK( !obj.isEmpty(), SDB_INVALIDARG, error, PDERROR,
"Parameter-object can't be empty!" );
}
BSONObjIterator iter( obj );
while ( iter.more() )
{
BSONElement beField = iter.next();
const CHAR *pFieldName = beField.fieldName();
PD_CHECK( pFieldName[0] != AGGR_KEYWORD_PREFIX, SDB_INVALIDARG, error, PDERROR,
"failed to parse \"project\", field name can't begin with\"$\"!" );
rc = parseSelectorField( beField, pCLName, pSelect->_selector,
pTable, hasFunc );
PD_RC_CHECK( rc, PDERROR, "failed to parse the field:%s", pFieldName );
}
if ( pSelect->_selector.empty() )
{
qgmOpField selectAll;
selectAll.type = SQL_GRAMMAR::WILDCARD;
pSelect->_selector.push_back( selectAll );
}
}
catch ( std::exception &e )
{
PD_CHECK( SDB_INVALIDARG, SDB_INVALIDARG, error, PDERROR,
"failed to parse the Parameter-object, received unexpected error:%s",
e.what() );
}
pSelect->_limit = -1;
pSelect->_skip = 0;
pSelect->_type = QGM_OPTI_TYPE_SELECT;
pSelect->_hasFunc = hasFunc;
rc = pTable->getOwnField( AGGR_CL_DEFAULT_ALIAS, pSelect->_alias );
PD_RC_CHECK( rc, PDERROR, "failed to get the field(%s)", AGGR_CL_DEFAULT_ALIAS );
if ( pCLName != NULL )
{
qgmField clValAttr;
qgmField clValRelegation;
rc = pTable->getOwnField( pCLName, clValAttr );
PD_RC_CHECK( rc, PDERROR, "failed to get the field(%s)", pCLName );
rc = pTable->getOwnField( AGGR_CL_DEFAULT_ALIAS, pSelect->_collection.alias );
PD_RC_CHECK( rc, PDERROR, "failed to get the field(%s)", AGGR_CL_DEFAULT_ALIAS );
pSelect->_collection.value = qgmDbAttr( clValRelegation, clValAttr );
pSelect->_collection.type = SQL_GRAMMAR::DBATTR;
}
pNode = pSelect;
done:
return rc;
error:
SAFE_OSS_DELETE( pSelect );
goto done;
}
示例2: if
Config::Config( const string& _dbname , const BSONObj& cmdObj ) {
dbname = _dbname;
ns = dbname + "." + cmdObj.firstElement().valuestr();
verbose = cmdObj["verbose"].trueValue();
uassert( 13602 , "outType is no longer a valid option" , cmdObj["outType"].eoo() );
if ( cmdObj["out"].type() == String ) {
finalShort = cmdObj["out"].String();
outType = REPLACE;
}
else if ( cmdObj["out"].type() == Object ) {
BSONObj o = cmdObj["out"].embeddedObject();
BSONElement e = o.firstElement();
string t = e.fieldName();
if ( t == "normal" || t == "replace" ) {
outType = REPLACE;
finalShort = e.String();
}
else if ( t == "merge" ) {
outType = MERGE;
finalShort = e.String();
}
else if ( t == "reduce" ) {
outType = REDUCE;
finalShort = e.String();
}
else if ( t == "inline" ) {
outType = INMEMORY;
}
else {
uasserted( 13522 , str::stream() << "unknown out specifier [" << t << "]" );
}
if (o.hasElement("db")) {
outDB = o["db"].String();
}
}
else {
uasserted( 13606 , "'out' has to be a string or an object" );
}
if ( outType != INMEMORY ) { // setup names
tempLong = str::stream() << (outDB.empty() ? dbname : outDB) << ".tmp.mr." << cmdObj.firstElement().String() << "_" << finalShort << "_" << JOB_NUMBER++;
incLong = tempLong + "_inc";
finalLong = str::stream() << (outDB.empty() ? dbname : outDB) << "." << finalShort;
}
{
// scope and code
if ( cmdObj["scope"].type() == Object )
scopeSetup = cmdObj["scope"].embeddedObjectUserCheck();
mapper.reset( new JSMapper( cmdObj["map"] ) );
reducer.reset( new JSReducer( cmdObj["reduce"] ) );
if ( cmdObj["finalize"].type() && cmdObj["finalize"].trueValue() )
finalizer.reset( new JSFinalizer( cmdObj["finalize"] ) );
if ( cmdObj["mapparams"].type() == Array ) {
mapParams = cmdObj["mapparams"].embeddedObjectUserCheck();
}
}
{
// query options
BSONElement q = cmdObj["query"];
if ( q.type() == Object )
filter = q.embeddedObjectUserCheck();
else
uassert( 13608 , "query has to be blank or an Object" , ! q.trueValue() );
BSONElement s = cmdObj["sort"];
if ( s.type() == Object )
sort = s.embeddedObjectUserCheck();
else
uassert( 13609 , "sort has to be blank or an Object" , ! s.trueValue() );
if ( cmdObj["limit"].isNumber() )
limit = cmdObj["limit"].numberLong();
else
limit = 0;
}
}
示例3: run
int run() {
string ns;
const bool csv = hasParam( "csv" );
const bool jsonArray = hasParam( "jsonArray" );
ostream *outPtr = &cout;
string outfile = getParam( "out" );
auto_ptr<ofstream> fileStream;
if ( hasParam( "out" ) ) {
size_t idx = outfile.rfind( "/" );
if ( idx != string::npos ) {
string dir = outfile.substr( 0 , idx + 1 );
boost::filesystem::create_directories( dir );
}
ofstream * s = new ofstream( outfile.c_str() , ios_base::out );
fileStream.reset( s );
outPtr = s;
if ( ! s->good() ) {
cerr << "couldn't open [" << outfile << "]" << endl;
return -1;
}
}
ostream &out = *outPtr;
BSONObj * fieldsToReturn = 0;
BSONObj realFieldsToReturn;
try {
ns = getNS();
}
catch (...) {
printHelp(cerr);
return 1;
}
auth();
if ( hasParam( "fields" ) || csv ) {
needFields();
// we can't use just _fieldsObj since we support everything getFieldDotted does
set<string> seen;
BSONObjBuilder b;
BSONObjIterator i( _fieldsObj );
while ( i.more() ){
BSONElement e = i.next();
string f = str::before( e.fieldName() , '.' );
if ( seen.insert( f ).second )
b.append( f , 1 );
}
realFieldsToReturn = b.obj();
fieldsToReturn = &realFieldsToReturn;
}
if ( csv && _fields.size() == 0 ) {
cerr << "csv mode requires a field list" << endl;
return -1;
}
Query q( getParam( "query" , "" ) );
if ( q.getFilter().isEmpty() && !hasParam("dbpath") && !hasParam("forceTableScan") )
q.snapshot();
bool slaveOk = _params["slaveOk"].as<bool>();
auto_ptr<DBClientCursor> cursor = conn().query( ns.c_str() , q , 0 , 0 , fieldsToReturn , ( slaveOk ? QueryOption_SlaveOk : 0 ) | QueryOption_NoCursorTimeout );
if ( csv ) {
for ( vector<string>::iterator i=_fields.begin(); i != _fields.end(); i++ ) {
if ( i != _fields.begin() )
out << ",";
out << *i;
}
out << endl;
}
if (jsonArray)
out << '[';
long long num = 0;
while ( cursor->more() ) {
num++;
BSONObj obj = cursor->next();
if ( csv ) {
for ( vector<string>::iterator i=_fields.begin(); i != _fields.end(); i++ ) {
if ( i != _fields.begin() )
out << ",";
const BSONElement & e = obj.getFieldDotted(i->c_str());
if ( ! e.eoo() ) {
out << csvString(e);
}
}
out << endl;
}
else {
if (jsonArray && num != 1)
out << ',';
//.........这里部分代码省略.........
示例4: i
StatusWith<BSONObj> fixDocumentForInsert( const BSONObj& doc ) {
if ( doc.objsize() > BSONObjMaxUserSize )
return StatusWith<BSONObj>( ErrorCodes::BadValue,
str::stream()
<< "object to insert too large"
<< ". size in bytes: " << doc.objsize()
<< ", max size: " << BSONObjMaxUserSize );
bool firstElementIsId = doc.firstElement().fieldNameStringData() == "_id";
bool hasTimestampToFix = false;
{
BSONObjIterator i( doc );
while ( i.more() ) {
BSONElement e = i.next();
if ( e.type() == Timestamp && e.timestampValue() == 0 ) {
// we replace Timestamp(0,0) at the top level with a correct value
// in the fast pass, we just mark that we want to swap
hasTimestampToFix = true;
}
const char* fieldName = e.fieldName();
if ( fieldName[0] == '$' ) {
return StatusWith<BSONObj>( ErrorCodes::BadValue,
str::stream()
<< "Document can't have $ prefixed field names: "
<< e.fieldName() );
}
// check no regexp for _id (SERVER-9502)
// also, disallow undefined and arrays
if ( str::equals( fieldName, "_id") ) {
if ( e.type() == RegEx ) {
return StatusWith<BSONObj>( ErrorCodes::BadValue,
"can't use a regex for _id" );
}
if ( e.type() == Undefined ) {
return StatusWith<BSONObj>( ErrorCodes::BadValue,
"can't use a undefined for _id" );
}
if ( e.type() == Array ) {
return StatusWith<BSONObj>( ErrorCodes::BadValue,
"can't use an array for _id" );
}
if ( e.type() == Object ) {
BSONObj o = e.Obj();
Status s = o.storageValidEmbedded();
if ( !s.isOK() )
return StatusWith<BSONObj>( s );
}
}
}
}
if ( firstElementIsId && !hasTimestampToFix )
return StatusWith<BSONObj>( BSONObj() );
bool hadId = firstElementIsId;
BSONObjIterator i( doc );
BSONObjBuilder b( doc.objsize() + 16 );
if ( firstElementIsId ) {
b.append( doc.firstElement() );
i.next();
}
else {
BSONElement e = doc["_id"];
if ( e.type() ) {
b.append( e );
hadId = true;
}
else {
b.appendOID( "_id", NULL, true );
}
}
while ( i.more() ) {
BSONElement e = i.next();
if ( hadId && e.fieldNameStringData() == "_id" ) {
// no-op
}
else if ( e.type() == Timestamp && e.timestampValue() == 0 ) {
mutex::scoped_lock lk(OpTime::m);
b.append( e.fieldName(), OpTime::now(lk) );
}
else {
b.append( e );
}
}
return StatusWith<BSONObj>( b.obj() );
}
示例5: run
//.........这里部分代码省略.........
Collection* targetColl = NULL;
while ( !sourceIt->isEOF() ) {
BSONObj o;
{
Client::Context srcCtx( source );
o = sourceColl->docFor(sourceIt->getNext());
}
// Insert and check return status of insert.
{
Client::Context ctx( target );
if ( !targetColl )
targetColl = ctx.db()->getCollection( target );
// No logOp necessary because the entire renameCollection command is one logOp.
Status s = targetColl->insertDocument( &txn, o, true ).getStatus();
if ( !s.isOK() ) {
insertSuccessful = false;
errmsg = s.toString();
break;
}
}
}
// If inserts were unsuccessful, drop the target collection and return false.
if ( !insertSuccessful ) {
Client::Context ctx( target );
Status s = ctx.db()->dropCollection( &txn, target );
if ( !s.isOK() )
errmsg = s.toString();
restoreIndexBuildsOnSource( indexesInProg, source );
return false;
}
// Copy over the indexes to temp storage and then to the target..
vector<BSONObj> copiedIndexes;
bool indexSuccessful = true;
{
Client::Context srcCtx( source );
IndexCatalog::IndexIterator sourceIndIt =
sourceColl->getIndexCatalog()->getIndexIterator( true );
while ( sourceIndIt.more() ) {
BSONObj currIndex = sourceIndIt.next()->infoObj();
// Process the source index.
BSONObjBuilder b;
BSONObjIterator i( currIndex );
while( i.moreWithEOO() ) {
BSONElement e = i.next();
if ( e.eoo() )
break;
else if ( strcmp( e.fieldName(), "ns" ) == 0 )
b.append( "ns", target );
else
b.append( e );
}
BSONObj newIndex = b.obj();
copiedIndexes.push_back( newIndex );
}
}
{
Client::Context ctx( target );
if ( !targetColl )
targetColl = ctx.db()->getCollection( target );
for ( vector<BSONObj>::iterator it = copiedIndexes.begin();
it != copiedIndexes.end(); ++it ) {
Status s = targetColl->getIndexCatalog()->createIndex( *it, true );
if ( !s.isOK() ) {
indexSuccessful = false;
errmsg = s.toString();
break;
}
}
// If indexes were unsuccessful, drop the target collection and return false.
if ( !indexSuccessful ) {
Status s = ctx.db()->dropCollection( &txn, target );
if ( !s.isOK() )
errmsg = s.toString();
restoreIndexBuildsOnSource( indexesInProg, source );
return false;
}
}
// Drop the source collection.
{
Client::Context srcCtx( source );
Status s = srcCtx.db()->dropCollection( &txn, source );
if ( !s.isOK() ) {
errmsg = s.toString();
restoreIndexBuildsOnSource( indexesInProg, source );
return false;
}
}
return true;
}
示例6: init
Status LiteParsedQuery::init(const string& ns, int ntoskip, int ntoreturn, int queryOptions,
const BSONObj& queryObj, const BSONObj& proj,
bool fromQueryMessage) {
_ns = ns;
_ntoskip = ntoskip;
_ntoreturn = ntoreturn;
_options = queryOptions;
_proj = proj.getOwned();
if (_ntoskip < 0) {
return Status(ErrorCodes::BadValue, "bad skip value in query");
}
if (_ntoreturn == std::numeric_limits<int>::min()) {
// _ntoreturn is negative but can't be negated.
return Status(ErrorCodes::BadValue, "bad limit value in query");
}
if (_ntoreturn < 0) {
// _ntoreturn greater than zero is simply a hint on how many objects to send back per
// "cursor batch". A negative number indicates a hard limit.
_wantMore = false;
_ntoreturn = -_ntoreturn;
}
if (fromQueryMessage) {
BSONElement queryField = queryObj["query"];
if (!queryField.isABSONObj()) { queryField = queryObj["$query"]; }
if (queryField.isABSONObj()) {
_filter = queryField.embeddedObject().getOwned();
Status status = initFullQuery(queryObj);
if (!status.isOK()) { return status; }
}
else {
// TODO: Does this ever happen?
_filter = queryObj.getOwned();
}
}
else {
// This is the debugging code path.
_filter = queryObj.getOwned();
}
_hasReadPref = queryObj.hasField("$readPreference");
if (!_sort.isEmpty()) {
if (!isValidSortOrder(_sort)) {
return Status(ErrorCodes::BadValue, "bad sort specification");
}
_sort = normalizeSortOrder(_sort);
}
// Min and Max objects must have the same fields.
if (!_min.isEmpty() && !_max.isEmpty()) {
if (!_min.isFieldNamePrefixOf(_max) || (_min.nFields() != _max.nFields())) {
return Status(ErrorCodes::BadValue, "min and max must have the same field names");
}
}
// Can't combine a normal sort and a $meta projection on the same field.
BSONObjIterator projIt(_proj);
while (projIt.more()) {
BSONElement projElt = projIt.next();
if (isTextScoreMeta(projElt)) {
BSONElement sortElt = _sort[projElt.fieldName()];
if (!sortElt.eoo() && !isTextScoreMeta(sortElt)) {
return Status(ErrorCodes::BadValue,
"can't have a non-$meta sort on a $meta projection");
}
}
}
// All fields with a $meta sort must have a corresponding $meta projection.
BSONObjIterator sortIt(_sort);
while (sortIt.more()) {
BSONElement sortElt = sortIt.next();
if (isTextScoreMeta(sortElt)) {
BSONElement projElt = _proj[sortElt.fieldName()];
if (projElt.eoo() || !isTextScoreMeta(projElt)) {
return Status(ErrorCodes::BadValue,
"must have $meta projection for all $meta sort keys");
}
}
}
return Status::OK();
}
示例7: handleSpecialNamespaces
bool handleSpecialNamespaces( Request& r , QueryMessage& q ) {
const char * ns = r.getns();
ns = strstr( r.getns() , ".$cmd.sys." );
if ( ! ns )
return false;
ns += 10;
r.checkAuth( Auth::WRITE );
BSONObjBuilder b;
vector<Shard> shards;
if ( strcmp( ns , "inprog" ) == 0 ) {
Shard::getAllShards( shards );
BSONArrayBuilder arr( b.subarrayStart( "inprog" ) );
for ( unsigned i=0; i<shards.size(); i++ ) {
Shard shard = shards[i];
ScopedDbConnection conn( shard );
BSONObj temp = conn->findOne( r.getns() , BSONObj() );
if ( temp["inprog"].isABSONObj() ) {
BSONObjIterator i( temp["inprog"].Obj() );
while ( i.more() ) {
BSONObjBuilder x;
BSONObjIterator j( i.next().Obj() );
while( j.more() ) {
BSONElement e = j.next();
if ( str::equals( e.fieldName() , "opid" ) ) {
stringstream ss;
ss << shard.getName() << ':' << e.numberInt();
x.append( "opid" , ss.str() );
}
else if ( str::equals( e.fieldName() , "client" ) ) {
x.appendAs( e , "client_s" );
}
else {
x.append( e );
}
}
arr.append( x.obj() );
}
}
conn.done();
}
arr.done();
}
else if ( strcmp( ns , "killop" ) == 0 ) {
BSONElement e = q.query["op"];
if ( strstr( r.getns() , "admin." ) == 0 ) {
b.append( "err" , "unauthorized" );
}
else if ( e.type() != String ) {
b.append( "err" , "bad op" );
b.append( e );
}
else {
b.append( e );
string s = e.String();
string::size_type i = s.find( ':' );
if ( i == string::npos ) {
b.append( "err" , "bad opid" );
}
else {
string shard = s.substr( 0 , i );
int opid = atoi( s.substr( i + 1 ).c_str() );
b.append( "shard" , shard );
b.append( "shardid" , opid );
log() << "want to kill op: " << e << endl;
Shard s(shard);
ScopedDbConnection conn( s );
conn->findOne( r.getns() , BSON( "op" << opid ) );
conn.done();
}
}
}
else if ( strcmp( ns , "unlock" ) == 0 ) {
b.append( "err" , "can't do unlock through mongos" );
}
else {
log( LL_WARNING ) << "unknown sys command [" << ns << "]" << endl;
return false;
}
BSONObj x = b.done();
replyToQuery(0, r.p(), r.m(), x);
return true;
}
示例8: _initAndListen
static void _initAndListen(int listenPort) {
Client::initThread("initandlisten");
getGlobalServiceContext()->setOpObserver(stdx::make_unique<OpObserver>());
const repl::ReplSettings& replSettings = repl::getGlobalReplicationCoordinator()->getSettings();
{
ProcessId pid = ProcessId::getCurrent();
LogstreamBuilder l = log(LogComponent::kControl);
l << "MongoDB starting : pid=" << pid << " port=" << serverGlobalParams.port
<< " dbpath=" << storageGlobalParams.dbpath;
if (replSettings.master)
l << " master=" << replSettings.master;
if (replSettings.slave)
l << " slave=" << (int)replSettings.slave;
const bool is32bit = sizeof(int*) == 4;
l << (is32bit ? " 32" : " 64") << "-bit host=" << getHostNameCached() << endl;
}
DEV log(LogComponent::kControl) << "DEBUG build (which is slower)" << endl;
#if defined(_WIN32)
printTargetMinOS();
#endif
logProcessDetails();
// Due to SERVER-15389, we must setupSockets first thing at startup in order to avoid
// obtaining too high a file descriptor for our calls to select().
MessageServer::Options options;
options.port = listenPort;
options.ipList = serverGlobalParams.bind_ip;
MessageServer* server = createServer(options, new MyMessageHandler());
server->setAsTimeTracker();
// This is what actually creates the sockets, but does not yet listen on them because we
// do not want connections to just hang if recovery takes a very long time.
if (!server->setupSockets()) {
error() << "Failed to set up sockets during startup.";
return;
}
std::shared_ptr<DbWebServer> dbWebServer;
if (serverGlobalParams.isHttpInterfaceEnabled) {
dbWebServer.reset(new DbWebServer(
serverGlobalParams.bind_ip, serverGlobalParams.port + 1000, new RestAdminAccess()));
if (!dbWebServer->setupSockets()) {
error() << "Failed to set up sockets for HTTP interface during startup.";
return;
}
}
getGlobalServiceContext()->initializeGlobalStorageEngine();
#ifdef MONGO_CONFIG_WIREDTIGER_ENABLED
if (WiredTigerCustomizationHooks::get(getGlobalServiceContext())->restartRequired()) {
exitCleanly(EXIT_CLEAN);
}
#endif
// Warn if we detect configurations for multiple registered storage engines in
// the same configuration file/environment.
if (serverGlobalParams.parsedOpts.hasField("storage")) {
BSONElement storageElement = serverGlobalParams.parsedOpts.getField("storage");
invariant(storageElement.isABSONObj());
BSONObj storageParamsObj = storageElement.Obj();
BSONObjIterator i = storageParamsObj.begin();
while (i.more()) {
BSONElement e = i.next();
// Ignore if field name under "storage" matches current storage engine.
if (storageGlobalParams.engine == e.fieldName()) {
continue;
}
// Warn if field name matches non-active registered storage engine.
if (getGlobalServiceContext()->isRegisteredStorageEngine(e.fieldName())) {
warning() << "Detected configuration for non-active storage engine "
<< e.fieldName() << " when current storage engine is "
<< storageGlobalParams.engine;
}
}
}
if (!getGlobalServiceContext()->getGlobalStorageEngine()->getSnapshotManager()) {
if (moe::startupOptionsParsed.count("replication.enableMajorityReadConcern")) {
// Note: we are intentionally only erroring if the user explicitly requested that we
// enable majority read concern. We do not error if the they are implicitly enabled for
// CSRS because a required step in the upgrade procedure can involve an mmapv1 node in
// the CSRS in the REMOVED state. This is handled by the TopologyCoordinator.
invariant(replSettings.majorityReadConcernEnabled);
severe() << "Majority read concern requires a storage engine that supports"
<< "snapshots, such as wiredTiger. " << storageGlobalParams.engine
<< " does not support snapshots.";
exitCleanly(EXIT_BADOPTIONS);
}
}
//.........这里部分代码省略.........
示例9: parseNewQuery
Status GeoNearExpression::parseNewQuery(const BSONObj &obj) {
bool hasGeometry = false;
BSONObjIterator objIt(obj);
if (!objIt.more()) {
return Status(ErrorCodes::BadValue, "empty geo near query object");
}
BSONElement e = objIt.next();
// Just one arg. to $geoNear.
if (objIt.more()) {
return Status(ErrorCodes::BadValue, mongoutils::str::stream() <<
"geo near accepts just one argument when querying for a GeoJSON " <<
"point. Extra field found: " << objIt.next());
}
// Parse "new" near:
// t.find({"geo" : {"$near" : {"$geometry": pointA, $minDistance: 1, $maxDistance: 3}}})
// t.find({"geo" : {"$geoNear" : {"$geometry": pointA, $minDistance: 1, $maxDistance: 3}}})
if (!e.isABSONObj()) {
return Status(ErrorCodes::BadValue, "geo near query argument is not an object");
}
BSONObj::MatchType matchType = static_cast<BSONObj::MatchType>(e.getGtLtOp());
if (BSONObj::opNEAR != matchType) {
return Status(ErrorCodes::BadValue, mongoutils::str::stream() <<
"invalid geo near query operator: " << e.fieldName());
}
// Iterate over the argument.
BSONObjIterator it(e.embeddedObject());
while (it.more()) {
BSONElement e = it.next();
if (equals(e.fieldName(), "$geometry")) {
if (e.isABSONObj()) {
BSONObj embeddedObj = e.embeddedObject();
Status status = GeoParser::parseQueryPoint(e, centroid.get());
if (!status.isOK()) {
return Status(ErrorCodes::BadValue,
str::stream()
<< "invalid point in geo near query $geometry argument: "
<< embeddedObj << " " << status.reason());
}
uassert(16681, "$near requires geojson point, given " + embeddedObj.toString(),
(SPHERE == centroid->crs));
hasGeometry = true;
}
} else if (equals(e.fieldName(), "$minDistance")) {
uassert(16897, "$minDistance must be a number", e.isNumber());
minDistance = e.Number();
uassert(16898, "$minDistance must be non-negative", minDistance >= 0.0);
} else if (equals(e.fieldName(), "$maxDistance")) {
uassert(16899, "$maxDistance must be a number", e.isNumber());
maxDistance = e.Number();
uassert(16900, "$maxDistance must be non-negative", maxDistance >= 0.0);
}
}
if (!hasGeometry) {
return Status(ErrorCodes::BadValue, "$geometry is required for geo near query");
}
return Status::OK();
}
示例10: i
StatusWith<BSONObj> FTSSpec::fixSpec(const BSONObj& spec) {
if (spec["textIndexVersion"].numberInt() == TEXT_INDEX_VERSION_1) {
return _fixSpecV1(spec);
}
map<string, int> m;
BSONObj keyPattern;
{
BSONObjBuilder b;
// Populate m and keyPattern.
{
bool addedFtsStuff = false;
BSONObjIterator i(spec["key"].Obj());
while (i.more()) {
BSONElement e = i.next();
if (e.fieldNameStringData() == "_fts") {
if (INDEX_NAME != e.valuestrsafe()) {
return {ErrorCodes::CannotCreateIndex, "expecting _fts:\"text\""};
}
addedFtsStuff = true;
b.append(e);
} else if (e.fieldNameStringData() == "_ftsx") {
if (e.numberInt() != 1) {
return {ErrorCodes::CannotCreateIndex, "expecting _ftsx:1"};
}
b.append(e);
} else if (e.type() == String && INDEX_NAME == e.valuestr()) {
if (!addedFtsStuff) {
_addFTSStuff(&b);
addedFtsStuff = true;
}
m[e.fieldName()] = 1;
} else {
if (e.numberInt() != 1 && e.numberInt() != -1) {
return {ErrorCodes::CannotCreateIndex,
"expected value 1 or -1 for non-text key in compound index"};
}
b.append(e);
}
}
verify(addedFtsStuff);
}
keyPattern = b.obj();
// Verify that index key is in the correct format: extraBefore fields, then text
// fields, then extraAfter fields.
{
BSONObjIterator i(spec["key"].Obj());
verify(i.more());
BSONElement e = i.next();
// extraBefore fields
while (String != e.type()) {
Status notReservedStatus = verifyFieldNameNotReserved(e.fieldNameStringData());
if (!notReservedStatus.isOK()) {
return notReservedStatus;
}
if (!i.more()) {
return {ErrorCodes::CannotCreateIndex,
"expected additional fields in text index key pattern"};
}
e = i.next();
}
// text fields
bool alreadyFixed = (e.fieldNameStringData() == "_fts");
if (alreadyFixed) {
if (!i.more()) {
return {ErrorCodes::CannotCreateIndex, "expected _ftsx after _fts"};
}
e = i.next();
if (e.fieldNameStringData() != "_ftsx") {
return {ErrorCodes::CannotCreateIndex, "expected _ftsx after _fts"};
}
e = i.next();
} else {
do {
Status notReservedStatus = verifyFieldNameNotReserved(e.fieldNameStringData());
if (!notReservedStatus.isOK()) {
return notReservedStatus;
}
e = i.next();
} while (!e.eoo() && e.type() == String);
}
// extraAfterFields
while (!e.eoo()) {
if (e.type() == BSONType::String) {
return {ErrorCodes::CannotCreateIndex,
"'text' fields in index must all be adjacent"};
}
Status notReservedStatus = verifyFieldNameNotReserved(e.fieldNameStringData());
if (!notReservedStatus.isOK()) {
return notReservedStatus;
}
//.........这里部分代码省略.........
示例11: keyIt
Status S2IndexCursor::seek(const BSONObj &position) {
vector<GeoQuery> regions;
bool isNearQuery = false;
NearQuery nearQuery;
// Go through the fields that we index, and for each geo one, make
// a GeoQuery object for the S2*Cursor class to do intersection
// testing/cover generating with.
BSONObjIterator keyIt(_descriptor->keyPattern());
while (keyIt.more()) {
BSONElement keyElt = keyIt.next();
if (keyElt.type() != String || IndexNames::GEO_2DSPHERE != keyElt.valuestr()) {
continue;
}
BSONElement e = position.getFieldDotted(keyElt.fieldName());
if (e.eoo()) { continue; }
if (!e.isABSONObj()) { continue; }
BSONObj obj = e.Obj();
if (nearQuery.parseFrom(obj, _params.radius)) {
if (isNearQuery) {
return Status(ErrorCodes::BadValue, "Only one $near clause allowed: " +
position.toString(), 16685);
}
isNearQuery = true;
nearQuery.field = keyElt.fieldName();
continue;
}
GeoQuery geoQueryField(keyElt.fieldName());
if (!geoQueryField.parseFrom(obj)) {
return Status(ErrorCodes::BadValue, "can't parse query (2dsphere): "
+ obj.toString(), 16535);
}
if (!geoQueryField.hasS2Region()) {
return Status(ErrorCodes::BadValue, "Geometry unsupported: " + obj.toString(),
16684);
}
regions.push_back(geoQueryField);
}
// Remove all the indexed geo regions from the query. The s2*cursor will
// instead create a covering for that key to speed up the search.
//
// One thing to note is that we create coverings for indexed geo keys during
// a near search to speed it up further.
BSONObjBuilder geoFieldsToNuke;
if (isNearQuery) {
geoFieldsToNuke.append(nearQuery.field, "");
}
for (size_t i = 0; i < regions.size(); ++i) {
geoFieldsToNuke.append(regions[i].getField(), "");
}
// false means we want to filter OUT geoFieldsToNuke, not filter to include only that.
BSONObj filteredQuery = position.filterFieldsUndotted(geoFieldsToNuke.obj(), false);
if (isNearQuery) {
S2NearIndexCursor* nearCursor = new S2NearIndexCursor(_descriptor, _params);
_underlyingCursor.reset(nearCursor);
nearCursor->seek(filteredQuery, nearQuery, regions);
} else {
S2SimpleCursor* simpleCursor = new S2SimpleCursor(_descriptor, _params);
_underlyingCursor.reset(simpleCursor);
simpleCursor->seek(filteredQuery, regions);
}
return Status::OK();
}
示例12: init
Status ModifierCurrentDate::init(const BSONElement& modExpr, const Options& opts) {
_updatePath.parse(modExpr.fieldName());
Status status = fieldchecker::isUpdatable(_updatePath);
if (!status.isOK()) {
return status;
}
// If a $-positional operator was used, get the index in which it occurred
// and ensure only one occurrence.
size_t foundCount;
fieldchecker::isPositional(_updatePath,
&_pathReplacementPosition,
&foundCount);
if (_pathReplacementPosition && foundCount > 1) {
return Status(ErrorCodes::BadValue, "too many positional($) elements found.");
}
// Validate and store the type to produce
switch (modExpr.type()) {
case Bool:
_typeIsDate = true;
break;
case Object: {
const BSONObj argObj = modExpr.embeddedObject();
const BSONElement typeElem = argObj.getField(kType);
bool badInput = typeElem.eoo() || !(typeElem.type() == String);
if (!badInput) {
std::string typeVal = typeElem.String();
badInput = !(typeElem.String() == kDate || typeElem.String() == kTimestamp);
if (!badInput)
_typeIsDate = (typeVal == kDate);
if (!badInput) {
// Check to make sure only the $type field was given as an arg
BSONObjIterator i( argObj );
const bool onlyHasTypeField = ((i.next().fieldNameStringData() == kType)
&& i.next().eoo());
if (!onlyHasTypeField) {
return Status(ErrorCodes::BadValue,
str::stream() <<
"The only valid field of the option is '$type': "
"{$currentDate: {field : {$type: 'date/timestamp'}}}; "
<< "arg: " << argObj);
}
}
}
if (badInput) {
return Status(ErrorCodes::BadValue,
"The '$type' string field is required "
"to be 'date' or 'timestamp': "
"{$currentDate: {field : {$type: 'date'}}}");
}
break;
}
default:
return Status(ErrorCodes::BadValue,
str::stream() << typeName(modExpr.type())
<< " is not valid type. Please use boolean ('true') "
"or a $type ({$type: 'timestamp/date'} expression. "
);
}
return Status::OK();
}
示例13: run
virtual bool run(const char *ns, BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
string source = cmdObj.getStringField( name.c_str() );
string target = cmdObj.getStringField( "to" );
if ( source.empty() || target.empty() ) {
errmsg = "invalid command syntax";
return false;
}
setClient( source.c_str() );
NamespaceDetails *nsd = nsdetails( source.c_str() );
uassert( "source namespace does not exist", nsd );
bool capped = nsd->capped;
long long size = 0;
if ( capped )
for( DiskLoc i = nsd->firstExtent; !i.isNull(); i = i.ext()->xnext )
size += i.ext()->length;
setClient( target.c_str() );
BSONObjBuilder spec;
if ( capped ) {
spec.appendBool( "capped", true );
spec.append( "size", double( size ) );
}
if ( !userCreateNS( target.c_str(), spec.done(), errmsg, true ) )
return false;
auto_ptr< DBClientCursor > c;
DBDirectClient bridge;
{
c = bridge.query( source, BSONObj() );
}
while( 1 ) {
{
if ( !c->more() )
break;
}
BSONObj o = c->next();
theDataFileMgr.insertAndLog( target.c_str(), o );
}
char cl[256];
nsToClient( source.c_str(), cl );
string sourceIndexes = string( cl ) + ".system.indexes";
nsToClient( target.c_str(), cl );
string targetIndexes = string( cl ) + ".system.indexes";
{
c = bridge.query( sourceIndexes, QUERY( "ns" << source ) );
}
while( 1 ) {
{
if ( !c->more() )
break;
}
BSONObj o = c->next();
BSONObjBuilder b;
BSONObjIterator i( o );
while( i.moreWithEOO() ) {
BSONElement e = i.next();
if ( e.eoo() )
break;
if ( strcmp( e.fieldName(), "ns" ) == 0 ) {
b.append( "ns", target );
} else {
b.append( e );
}
}
BSONObj n = b.done();
theDataFileMgr.insertAndLog( targetIndexes.c_str(), n );
}
{
if ( !bridge.dropCollection( source ) ) {
errmsg = "failed to drop old name collection";
return false;
}
}
return true;
}
示例14: computeProperties
void IndexScanNode::computeProperties() {
_sorts.clear();
BSONObj sortPattern;
{
BSONObjBuilder sortBob;
BSONObj normalizedIndexKeyPattern(LiteParsedQuery::normalizeSortOrder(indexKeyPattern));
BSONObjIterator it(normalizedIndexKeyPattern);
while (it.more()) {
BSONElement elt = it.next();
// Zero is returned if elt is not a number. This happens when elt is hashed or
// 2dsphere, our two projection indices. We want to drop those from the sort
// pattern.
int val = elt.numberInt() * direction;
if (0 != val) {
sortBob.append(elt.fieldName(), val);
}
}
sortPattern = sortBob.obj();
}
_sorts.insert(sortPattern);
const int nFields = sortPattern.nFields();
if (nFields > 1) {
// We're sorted not only by sortPattern but also by all prefixes of it.
for (int i = 0; i < nFields; ++i) {
// Make obj out of fields [0,i]
BSONObjIterator it(sortPattern);
BSONObjBuilder prefixBob;
for (int j = 0; j <= i; ++j) {
prefixBob.append(it.next());
}
_sorts.insert(prefixBob.obj());
}
}
// If we are using the index {a:1, b:1} to answer the predicate {a: 10}, it's sorted
// both by the index key pattern and by the pattern {b: 1}.
// See if there are any fields with equalities for bounds. We can drop these
// from any sort orders created.
set<string> equalityFields;
if (!bounds.isSimpleRange) {
// Figure out how many fields are point intervals.
for (size_t i = 0; i < bounds.fields.size(); ++i) {
const OrderedIntervalList& oil = bounds.fields[i];
if (oil.intervals.size() != 1) {
continue;
}
const Interval& ival = oil.intervals[0];
if (!ival.isPoint()) {
continue;
}
equalityFields.insert(oil.name);
}
}
if (equalityFields.empty()) {
return;
}
// TODO: Each field in equalityFields could be dropped from the sort order since it is
// a point interval. The full set of sort orders is as follows:
// For each sort in _sorts:
// For each drop in powerset(equalityFields):
// Remove fields in 'drop' from 'sort' and add resulting sort to output.
// Since this involves a powerset, we only remove point intervals that the prior sort
// planning code removed, namely the contiguous prefix of the key pattern.
BSONObjIterator it(sortPattern);
BSONObjBuilder prefixBob;
while (it.more()) {
BSONElement elt = it.next();
// XXX string slowness. fix when bounds are stringdata not string.
if (equalityFields.end() == equalityFields.find(string(elt.fieldName()))) {
prefixBob.append(elt);
// This field isn't a point interval, can't drop.
break;
}
}
while (it.more()) {
prefixBob.append(it.next());
}
// If we have an index {a:1} and an equality on 'a' don't append an empty sort order.
BSONObj filterPointsObj = prefixBob.obj();
if (!filterPointsObj.isEmpty()) {
_sorts.insert(filterPointsObj);
}
}
示例15: b
void BtreeKeyGeneratorV0::getKeysImpl(std::vector<const char*> fieldNames,
std::vector<BSONElement> fixed,
const BSONObj& obj,
BSONObjSet* keys,
MultikeyPaths* multikeyPaths) const {
if (_isIdIndex) {
// we special case for speed
BSONElement e = obj["_id"];
if (e.eoo()) {
keys->insert(_nullKey);
} else {
int size = e.size() + 5 /* bson over head*/ - 3 /* remove _id string */;
BSONObjBuilder b(size);
b.appendAs(e, "");
keys->insert(b.obj());
invariant(keys->begin()->objsize() == size);
}
return;
}
BSONElement arrElt;
unsigned arrIdx = ~0;
unsigned numNotFound = 0;
for (unsigned i = 0; i < fieldNames.size(); ++i) {
if (*fieldNames[i] == '\0')
continue;
BSONElement e = dps::extractElementAtPathOrArrayAlongPath(obj, fieldNames[i]);
if (e.eoo()) {
e = nullElt; // no matching field
numNotFound++;
}
if (e.type() != Array)
fieldNames[i] = ""; // no matching field or non-array match
if (*fieldNames[i] == '\0')
// no need for further object expansion (though array expansion still possible)
fixed[i] = e;
if (e.type() == Array && arrElt.eoo()) {
// we only expand arrays on a single path -- track the path here
arrIdx = i;
arrElt = e;
}
// enforce single array path here
if (e.type() == Array && e.rawdata() != arrElt.rawdata()) {
assertParallelArrays(e.fieldName(), arrElt.fieldName());
}
}
bool allFound = true; // have we found elements for all field names in the key spec?
for (std::vector<const char*>::const_iterator i = fieldNames.begin(); i != fieldNames.end();
++i) {
if (**i != '\0') {
allFound = false;
break;
}
}
if (_isSparse && numNotFound == _fieldNames.size()) {
// we didn't find any fields
// so we're not going to index this document
return;
}
bool insertArrayNull = false;
if (allFound) {
if (arrElt.eoo()) {
// no terminal array element to expand
BSONObjBuilder b(_sizeTracker);
for (std::vector<BSONElement>::iterator i = fixed.begin(); i != fixed.end(); ++i)
b.appendAs(*i, "");
keys->insert(b.obj());
} else {
// terminal array element to expand, so generate all keys
BSONObjIterator i(arrElt.embeddedObject());
if (i.more()) {
while (i.more()) {
BSONObjBuilder b(_sizeTracker);
for (unsigned j = 0; j < fixed.size(); ++j) {
if (j == arrIdx)
b.appendAs(i.next(), "");
else
b.appendAs(fixed[j], "");
}
keys->insert(b.obj());
}
} else if (fixed.size() > 1) {
insertArrayNull = true;
}
}
} else {
// nonterminal array element to expand, so recurse
verify(!arrElt.eoo());
BSONObjIterator i(arrElt.embeddedObject());
//.........这里部分代码省略.........