20#include <boost/noncopyable.hpp>
27#include "mongo/bson/bsonelement.h"
28#include "mongo/base/data_view.h"
29#include "mongo/base/string_data.h"
30#include "mongo/bson/util/builder.h"
31#include "mongo/client/export_macros.h"
32#include "mongo/platform/atomic_word.h"
33#include "mongo/util/shared_buffer.h"
37typedef std::set<BSONElement, BSONElementCmpWithoutField> BSONElementSet;
38typedef std::multiset<BSONElement, BSONElementCmpWithoutField> BSONElementMSet;
85 static const char kEmptyObjectPrototype[] = { 5, 0, 0, 0, 0};
86 _objdata = kEmptyObjectPrototype;
97 : _objdata(ownedBuffer.get() ? ownedBuffer.get() :
BSONObj().objdata()),
98 _ownedBuffer(ownedBuffer.moveFrom()) {}
100#if __cplusplus >= 201103L
102 BSONObj(BSONObj&& other)
103 : _objdata(std::move(other._objdata)), _ownedBuffer(std::move(other._ownedBuffer)) {
104 other._objdata = BSONObj()._objdata;
111 BSONObj(
const BSONObj&) =
default;
118 this->swap(otherCopy);
125 swap(_objdata, other._objdata);
126 swap(_ownedBuffer, other._ownedBuffer);
158 return _ownedBuffer.get() != 0;
172 enum { maxToStringRecursionDepth = 100 };
174 std::string toString(
bool isArray =
false,
bool full =
false)
const;
175 void toString(
StringBuilder& s,
bool isArray =
false,
bool full =
false,
int depth = 0)
const;
182 bool isArray =
false)
const;
212 bool expandLastArray =
true)
const;
213 void getFieldsDotted(
const StringData& name,
214 BSONElementMSet& ret,
215 bool expandLastArray =
true)
const;
239 return getField(field);
245 std::string s = ss.str();
246 return getField(s.c_str());
251 return !getField(name).eoo();
255 return hasField(name);
293 BSONObj filterFieldsUndotted(
const BSONObj& filter,
bool inFilter)
const;
295 BSONElement getFieldUsingIndexNames(
const StringData& fieldName,
const BSONObj& indexKey)
const;
309 return ConstDataView(objdata()).readLE<
int>();
315 return x > 0 && x <= BSONObjMaxInternalSize;
325 return _okForStorage(
false,
true).isOK();
335 return _okForStorage(
true,
true).isOK();
347 return _okForStorage(
false, deep);
359 return _okForStorage(
true, deep);
364 return objsize() <= 5;
386 bool considerFieldName =
true)
const;
388 bool operator<(
const BSONObj& other)
const {
389 return woCompare(other) < 0;
391 bool operator<=(
const BSONObj& other)
const {
392 return woCompare(other) <= 0;
394 bool operator>(
const BSONObj& other)
const {
395 return woCompare(other) > 0;
397 bool operator>=(
const BSONObj& other)
const {
398 return woCompare(other) >= 0;
406 bool equal(
const BSONObj& r)
const;
414 size_t operator()(
const BSONObj& obj)
const;
439 return (os == 0 || memcmp(objdata(), r.
objdata(), os) == 0);
453 const char* p = objdata() + 4;
454 return *p ==
EOO ?
"" : p + 1;
458 const char* p = objdata() + 4;
473 BSONObj clientReadable()
const;
482 bool operator==(
const BSONObj& other)
const {
485 bool operator!=(
const BSONObj& other)
const {
486 return !operator==(other);
508 opMAX_DISTANCE = 0x15,
509 opGEO_INTERSECTS = 0x16,
513 void elems(std::vector<BSONElement>&)
const;
515 void elems(std::list<BSONElement>&)
const;
528 void appendSelfToBufBuilder(
BufBuilder& b)
const {
530 b.appendBuf(objdata(), objsize());
533 template <
typename T>
534 bool coerceVector(std::vector<T>* out)
const;
546 return BSONObj(SharedBuffer::takeOwnership(holderPrefixedData));
550 void _assertInvalid()
const;
552 void init(
const char* data) {
564 Status _okForStorage(
bool root,
bool deep)
const;
566 const char* _objdata;
567 SharedBuffer _ownedBuffer;
570MONGO_CLIENT_API std::ostream& MONGO_CLIENT_FUNC operator<<(std::ostream& s,
const BSONObj& o);
571MONGO_CLIENT_API std::ostream& MONGO_CLIENT_FUNC operator<<(std::ostream& s,
const BSONElement& e);
573MONGO_CLIENT_API StringBuilder& MONGO_CLIENT_FUNC operator<<(StringBuilder& s,
const BSONObj& o);
574MONGO_CLIENT_API StringBuilder& MONGO_CLIENT_FUNC
575operator<<(StringBuilder& s,
const BSONElement& e);
577inline void swap(BSONObj& l, BSONObj& r) {
BSONElement represents an "element" in a BSONObj.
Definition bsonelement.h:55
iterator for a BSONObj
Definition bsonobjiterator.h:37
C++ representation of a "BSON" object – that is, an extended JSON-style object in a binary representa...
Definition bsonobj.h:78
void getFields(unsigned n, const char **fieldNames, BSONElement *fields) const
Get several fields at once.
bool getObjectID(BSONElement &e) const
Get the _id field from the object.
BSONObj & operator=(BSONObj otherCopy)
Provide assignment semantics.
Definition bsonobj.h:117
bool okForStorage() const
Definition bsonobj.h:324
int woCompare(const BSONObj &r, const BSONObj &ordering=BSONObj(), bool considerFieldName=true) const
wo='well ordered'.
int addFields(BSONObj &from, std::set< std::string > &fields)
note: addFields always adds _id even if not specified
const char * firstElementFieldName() const
faster than firstElement().fieldName() - for the first element we can easily find the fieldname witho...
Definition bsonobj.h:452
bool isOwned() const
A BSONObj can use a buffer it "owns" or one it does not.
Definition bsonobj.h:157
static BSONObj takeOwnership(char *holderPrefixedData)
Given a pointer to a region of un-owned memory containing BSON data, prefixed by sufficient space for...
Definition bsonobj.h:545
bool getBoolField(const StringData &name) const
BSONObj getObjectField(const StringData &name) const
int getFieldNames(std::set< std::string > &fields) const
adds the field names to the fields set.
Status storageValidEmbedded(const bool deep=true) const
Validates that this can be stored as an embedded document See details above in okForStorage.
Definition bsonobj.h:346
bool okForStorageAsRoot() const
Same as above with the following extra restrictions Not valid if:
Definition bsonobj.h:334
bool couldBeArray() const
arrays are bson objects with numeric and increasing field names
BSONObjIterator begin() const
use something like this: for( BSONObj::iterator i = myObj.begin(); i.more(); ) { BSONElement e = i....
BSONElement getFieldDottedOrArray(const char *&name) const
Like getFieldDotted(), but returns first array encountered while traversing the dotted fields of name...
bool hasField(const StringData &name) const
Definition bsonobj.h:250
void getFieldsDotted(const StringData &name, BSONElementSet &ret, bool expandLastArray=true) const
Like getFieldDotted(), but expands arrays and returns all matching objects.
BSONObj extractFields(const BSONObj &pattern, bool fillWithNull=false) const
extract items from object which match a pattern object.
BSONElement operator[](const StringData &field) const
Get the field of the specified name.
Definition bsonobj.h:238
BSONObj getOwned() const
assure the data buffer is under the control of this BSONObj and not a remote buffer
std::string jsonString(JsonStringFormat format=Strict, int pretty=0, bool isArray=false) const
Properly formatted JSON string.
int objsize() const
Definition bsonobj.h:308
bool isValid() const
performs a cursory check on the object's size only.
Definition bsonobj.h:313
void elems(std::list< BSONElement > &) const
add all elements of the object to the specified list
BSONObj replaceFieldNames(const BSONObj &obj) const
Return new object with the field names replaced by those in the passed object.
BSONObj(const char *bsonData)
Construct a BSONObj from data in the proper format.
Definition bsonobj.h:92
bool isFieldNamePrefixOf(const BSONObj &otherObj) const
int woSortOrder(const BSONObj &r, const BSONObj &sortKey, bool useDotted=false) const
Status storageValid(const bool deep=true) const
Validates that this can be stored as a document (in a collection) See details above in okForStorageAs...
Definition bsonobj.h:358
void elems(std::vector< BSONElement > &) const
add all elements of the object to the specified vector
const char * getStringField(const StringData &name) const
bool binaryEqual(const BSONObj &r) const
This is "shallow equality" – ints and doubles won't match.
Definition bsonobj.h:436
void swap(BSONObj &other)
Swap this BSONObj with 'other'.
Definition bsonobj.h:123
BSONElement getFieldDotted(const StringData &name) const
bool isPrefixOf(const BSONObj &otherObj) const
const char * objdata() const
Definition bsonobj.h:303
bool isEmpty() const
Definition bsonobj.h:363
int woCompare(const BSONObj &r, const Ordering &o, bool considerFieldName=true) const
wo='well ordered'.
bool valid() const
true unless corrupt
int nFields() const
returns # of top level fields in the object note: iterates to count the fields
std::string hexDump() const
Alternative output format.
BSONObj()
Construct an empty BSONObj – that is, {}.
Definition bsonobj.h:81
int getIntField(const StringData &name) const
BSONObj removeField(const StringData &name) const
remove specified field and return a new object with the remaining fields.
BSONElement getField(const StringData &name) const
Get the field of the specified name.
bool hasElement(const StringData &name) const
Definition bsonobj.h:254
BSONObj extractFieldsUnDotted(const BSONObj &pattern) const
BSONElement firstElement() const
Definition bsonobj.h:445
A precomputation of a BSON index or sort key pattern.
Definition ordering.h:32
Definition shared_buffer.h:67
Definition shared_buffer.h:25
std::stringstream deals with locale so this is a lot faster than std::stringstream for UTF8
Definition builder.h:325
the main MongoDB namespace
Definition bulk_operation_builder.h:24
JsonStringFormat
Formatting mode for generating JSON from BSON.
Definition oid.h:205
MONGO_CLIENT_API Status(MONGO_CLIENT_FUNC *saslClientAuthenticate)(DBClientWithCommands *client
Attempts to authenticate "client" using the SASL protocol.
BSONType
the complete list of valid BSON types see also bsonspec.org
Definition bsontypes.h:38
@ EOO
end of object
Definition bsontypes.h:42
Functor compatible with std::hash for std::unordered_{map,set} Warning: The hash function is subject ...
Definition bsonobj.h:413