bool TMongoDriver::insert(const QString &collection, const QVariantMap &object) { if (!isOpen()) { return false; } errorCode = 0; errorString.clear(); bson_error_t error; mongoc_collection_t *col = mongoc_client_get_collection(mongoClient, qPrintable(dbName), qPrintable(collection)); bool res = mongoc_collection_insert(col, MONGOC_INSERT_NONE, (bson_t *)TBson::toBson(object).constData(), nullptr, &error); setLastCommandStatus(mongoc_collection_get_last_error(col)); mongoc_collection_destroy(col); if (!res) { tSystemError("MongoDB Insert Error: %s", error.message); errorCode = error.code; errorString = QLatin1String(error.message); } return res; }
int TMongoDriver::count(const QString &collection, const QVariantMap &criteria) { if (!isOpen()) { return false; } errorCode = 0; errorString.clear(); bson_error_t error; mongoc_collection_t *col = mongoc_client_get_collection(mongoClient, qPrintable(dbName), qPrintable(collection)); int count = mongoc_collection_count(col, MONGOC_QUERY_NONE, (bson_t *)TBson::toBson(criteria).data(), 0, 0, nullptr, &error); setLastCommandStatus(mongoc_collection_get_last_error(col)); mongoc_collection_destroy(col); if (count < 0) { tSystemError("MongoDB Count Error: %s", error.message); errorCode = error.code; errorString = QLatin1String(error.message); } return count; }
/* public function update(array $criteria, array $new_object, array $options = array()): mixed; */ static Variant HHVM_METHOD(MongoCollection, update, Array criteria, Array new_object, Array options) { mongoc_collection_t *collection; bson_t selector; //selector is the criteria (which document to update) bson_t update; //update is the new_object containing the new data const bson_t * collection_error; //update is the new_object containing the new data bson_error_t error; collection = get_collection(this_); encodeToBSON(criteria, &selector); encodeToBSON(new_object, &update); //先定义一些默认的参数 mongoc_update_flags_t update_flag = MONGOC_UPDATE_NONE; //todo int w_flag = MONGOC_WRITE_CONCERN_W_DEFAULT; //如果传递了参数 if(!options.empty()){ //printf("multiple = %s\r\n",options[String("multiple")].toBoolean() ? "true":"false"); if(options[String("multiple")].toBoolean()==true){ update_flag = MONGOC_UPDATE_MULTI_UPDATE; } if(options[String("upsert")].toBoolean()==true){ update_flag = MONGOC_UPDATE_UPSERT; } } mongoc_write_concern_t *write_concern; write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, w_flag); bool ret = mongoc_collection_update(collection, update_flag, &selector, &update, write_concern, &error); bson_destroy(&update); bson_destroy(&selector); if (!ret) { mongoThrow<MongoCursorException>((const char *) error.message); } collection_error = mongoc_collection_get_last_error(collection); //char *str; //if (collection_error) { //for debug //str = bson_as_json(collection_error, NULL); //printf("debug = %s\r\n",str); //bson_free(str); //} Array collectionReturn = Array(); Array ouput = Array(); collectionReturn = cbson_loads(collection_error); mongoc_collection_destroy(collection); ouput.add(String("ok"),1); ouput.add(String("nModified"),collectionReturn[String("nModified")]); ouput.add(String("n"),collectionReturn[String("nMatched")]); ouput.add(String("updatedExisting"),collectionReturn[String("nMatched")].toInt64() > 0 ?true:false);//todo ouput.add(String("err"),collectionReturn[String("writeErrors")]); ouput.add(String("errmsg"),collectionReturn[String("writeErrors")]); const StaticString s_MongoTimestamp("MongoTimestamp"); Array mongotimestampParam = Array(); ObjectData * data = create_object(&s_MongoTimestamp,mongotimestampParam); ouput.add(String("lastOp"), data); ouput.add(String("mongoRaw"),collectionReturn); return ouput; //return ret; }