前言
使用mongoc查询特定记录, 使用2个mongoc API:
mongoc_collection_find_with_opts
mongoc_cursor_next
构造查询条件时, 和组装document时一样, 但是只组装能区分数据那部分.
如果document初始化后, 不组装查询条件, 结果集就是全部记录.
查询结果回来后, 将bson_t转成json, 剩下就是分析json内容的任务了.
还没看mongoc中如何解析json, 不知道要不要再找个分析json的库.
记录
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <cstddef>
#include "MongoDbEx.h"
#include "BusinessLogic.h"
int testcase_mongoc_example_command_simple(int argc, char* argv[]);
int testcase_mongoc_example_document_add(int argc, char* argv[]);
int testcase_mongoc_example_document_query_all(int argc, char* argv[]);
int testcase_mongoc_example_document_query_special(int argc, char* argv[]);
int main(int argc, char* argv[])
{
printf("============================================================\n");
printf(">> testcase v1.0.0.5\n");
printf("============================================================\n");
testcase_mongoc_example_document_query_special(argc, argv);
// testcase_mongoc_example_document_query_all(argc, argv);
// testcase_mongoc_example_document_add(argc, argv);
// testcase_mongoc_example_command_simple(argc, argv);
printf("============================================================\n");
printf("END\n");
printf("============================================================\n");
return 0;
}
int testcase_mongoc_example_document_query_special(int argc, char* argv[])
{
mongoc_client_t *client;
mongoc_collection_t *collection;
mongoc_cursor_t *cursor;
const bson_t *doc;
bson_t* query;
bson_t child;
long lIndex = 0;
char szBuf[260] = {'\0'};
mongoc_init ();
client = mongoc_client_new (
"mongodb://localhost:27017/?appname=find-specific-example");
collection = mongoc_client_get_collection (client, "db_ls", "coll_ls");
query = bson_new ();
// find db record set name : {first:lostspeed3, last:cn}
bson_append_document_begin(query, "name", -1, &child);
BSON_APPEND_UTF8(&child, "first", "lostspeed3");
BSON_APPEND_UTF8(&child, "last", "cn");
bson_append_document_end(query, &child);
cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL);
while (mongoc_cursor_next (cursor, &doc)) {
sprintf(szBuf, "find [%ld]\0", lIndex++);
ShowDocument(szBuf, (bson_t*)doc);
// ok : only find one record
/**
[find [0]]
{ "_id" : { "$oid" : "58e351936e955221a1689462" },
"name" : { "first" : "lostspeed3", "last" : "cn" },
"birthday" : { "$date" : 2234350468000 },
"skill" : [ "C", "C++", "MASM", "RE" ],
"degrees" : [
{ "school" : "zhongnian", "degree" : "graduates" },
{ "school" : "cr", "degree" : "graduates" } ] }
*/
}
bson_destroy (query);
mongoc_cursor_destroy (cursor);
mongoc_collection_destroy (collection);
mongoc_client_destroy (client);
mongoc_cleanup ();}
int testcase_mongoc_example_document_query_all(int argc, char* argv[])
{
mongoc_client_t* client = NULL;
mongoc_collection_t* collection = NULL;
mongoc_cursor_t* cursor = NULL;
const bson_t* doc = NULL;
bson_t* query = NULL;
long lIndex = 0;
char szBuf[260] = {'\0'};
mongoc_init ();
client = mongoc_client_new ("mongodb://localhost:27017/?appname=find-example");
collection = mongoc_client_get_collection (client, "db_ls", "coll_ls");
query = bson_new ();
cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL);
while (mongoc_cursor_next (cursor, &doc)) {
sprintf(szBuf, "%ld\0", lIndex++) ;
ShowDocument(szBuf, (bson_t*)doc);
}
bson_destroy (query);
mongoc_cursor_destroy (cursor);
mongoc_collection_destroy (collection);
mongoc_client_destroy (client);
mongoc_cleanup ();
return 0;
}
int testcase_mongoc_example_document_add(int argc, char* argv[])
{
bool bRc = false;
TAG_PERSON_INFO person;
bson_t* document = NULL;
mongoc_client_t* client = NULL;
mongoc_database_t* database = NULL;
mongoc_collection_t* collection = NULL;
bson_error_t error;
bool retval = false;
do {
memset(&person, sizeof(person), 0);
mongoc_init();
client = mongoc_client_new("mongodb://localhost:27017");
mongoc_client_set_appname(client, "CRUD-Add");
database = mongoc_client_get_database(client, "db_ls");
collection = mongoc_client_get_collection(client, "db_ls", "coll_ls");
// cmd : ping
retval = DbOptExec_command_simple(client, "admin", "ping", &error);
if (!retval) {
ShowErrMsg("ping", &error);
break;
}
person.birthday.tm_year = 1973 - 1900; // base 1900
person.birthday.tm_mon = 4;
person.birthday.tm_mday = 1;
person.name.first = "lostspeed";
person.name.last = "cn";
person.skillAry[0] = "C";
person.skillAry[1] = "C++";
person.skillAry[2] = "MASM";
person.skillAry[3] = "RE";
person.skillAry[4] = NULL; // !
person.degreeAry[0].degree = "graduates";
person.degreeAry[0].school = "zhongnian";
person.degreeAry[1].degree = "graduates";
person.degreeAry[1].school = "cr";
person.degreeAry[2].degree = NULL; // !
person.degreeAry[2].school = NULL; // !
document = bson_new();
fill_TAG_PERSON_INFO(document, &person);
// use document ...
ShowDocument("person", document);
/**
// 这个ok
[person] {
"name" : {
"first" : "lostspeed",
"last" : "cn" },
"birthday" : { "$date" : 1404690916000 } }
// 这个ok
[person] {
"name" : {
"first" : "lostspeed",
"last" : "cn" },
"birthday" : { "$date" : -1211776988000 },
"skill" : [ "C", "C++", "MASM", "RE" ]
}
// ok
[person] {
"name" : { "first" : "lostspeed", "last" : "cn" },
"birthday" : { "$date" : 2234350468000 },
"skill" : [ "C", "C++", "MASM", "RE" ],
"degrees" : [
{ "school" : "zhongnian", "degree" : "graduates" },
{ "school" : "cr", "degree" : "graduates" } ] }
// 下面这个格式有问题
// 虽然从json内容看不出来, 但是报错原因为degrees下的复合数据要加标号
// 数组的数据必须加数组下标
[person] {
"name" : { "first" : "lostspeed", "last" : "cn" },
"birthday" : { "$date" : 105087610000 },
"skill" : [ "C", "C++", "MASM", "RE" ],
"degrees" : [
{ "school" : "zhongnian", "degree" : "graduates" },
{ "school" : "cr", "degree" : "graduates" } ]
}
*/
bRc = DbOptAddDocument(collection, document, &error);
if (bRc) {
printf("CURD-add ok\n");
} else {
ShowErrMsg("CURD-add", &error);
}
} while (0);
if (NULL != document) {
bson_destroy(document);
}
if (NULL != collection) {
mongoc_collection_destroy(collection);
}
if (NULL != database) {
mongoc_database_destroy(database);
}
if (NULL != client) {
mongoc_client_destroy(client);
}
return 0;
}
int testcase_mongoc_example_command_simple(int argc, char* argv[])
{
mongoc_client_t* client = NULL;
mongoc_database_t* database = NULL;
mongoc_collection_t* collection = NULL;
bson_t* insert = NULL;
bson_error_t error;
bool retval = false;
mongoc_init();
client = mongoc_client_new("mongodb://localhost:27017");
/*
* Register the application name so we can track it in the profile logs
* on the server. This can also be done from the URI (see other examples).
*/
mongoc_client_set_appname(client, "connect-example");
database = mongoc_client_get_database(client, "db_name");
collection = mongoc_client_get_collection(client, "db_name", "coll_name");
// cmd : ping
retval = DbOptExec_command_simple(client, "admin", "ping", &error);
if (!retval) {
ShowErrMsg("ping", &error);
return EXIT_FAILURE;
}
/**
[ping] { "ok" : 1.0 }
*/
insert = BCON_NEW("hello", BCON_UTF8("world"));
if (!mongoc_collection_insert(
collection, MONGOC_INSERT_NONE, insert, NULL, &error)) {
ShowErrMsg("mongoc_collection_insert", &error);
}
// cmd : buildinfo
bson_destroy(insert);
retval = DbOptExec_command_simple(client, "admin", "buildinfo", &error);
if (!retval) {
ShowErrMsg("buildinfo", &error);
}
/**
[buildinfo] {
"version" : "2.6.10",
"gitVersion" : "5901dbfb49d16eaef6f2c2c50fba534d23ac7f6c",
"OpenSSLVersion" : "",
"sysInfo" : "Linux build18.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49",
"loaderFlags" : "-fPIC -pthread -Wl,-z,now -rdynamic",
"compilerFlags" : "-Wnon-virtual-dtor -Woverloaded-virtual -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -pipe -Werror -O3 -Wno-unused-function -Wno-deprecated-declarations -fno-builtin-memcmp",
"allocator" : "tcmalloc",
"versionArray" : [ 2, 6, 10, 0 ],
"javascriptEngine" : "V8",
"bits" : 64,
"debug" : false,
"maxBsonObjectSize" : 16777216,
"ok" : 1.0 }
*/
// cmd : serverStatus
retval = DbOptExec_command_simple(client, "admin", "serverStatus", &error);
if (!retval) {
ShowErrMsg("serverStatus", &error);
}
/**
[serverStatus]
{
"host" : "debian",
"version" : "2.6.10",
"process" : "mongod",
"pid" : 3243,
"uptime" : 21899.0,
"uptimeMillis" : 21897854,
"uptimeEstimate" : 19920.0,
"localTime" : { "$date" : 1491227764737 },
"asserts" : { "regular" : 0, "warning" : 0, "msg" : 0, "user" : 0, "rollovers" : 0 },
"backgroundFlushing" : { "flushes" : 364, "total_ms" : 54, "average_ms" : 0.14835164835164835195, "last_ms" : 0, "last_finished" : { "$date" : 1491227708337 } },
"connections" : { "current" : 1, "available" : 818, "totalCreated" : 9 },
"cursors" : { "note" : "deprecated, use server status metrics", "clientCursors_size" : 0, "totalOpen" : 0, "pinned" : 0, "totalNoTimeout" : 0, "timedOut" : 0 },
"dur" : { "commits" : 29, "journaledMB" : 0.0, "writeToDataFilesMB" : 0.0, "compression" : 0.0, "commitsInWriteLock" : 0, "earlyCommits" : 0,
"timeMs" : { "dt" : 3044, "prepLogBuffer" : 0, "writeToJournal" : 0, "writeToDataFiles" : 0, "remapPrivateView" : 0 } },
"extra_info" : { "note" : "fields vary by platform", "heap_usage_bytes" : 62725408, "page_faults" : 98 },
"globalLock" : { "totalTime" : 21897856000, "lockTime" : 5334268,
"currentQueue" : { "total" : 0, "readers" : 0, "writers" : 0 },
"activeClients" : { "total" : 0, "readers" : 0, "writers" : 0 } },
"indexCounters" : { "accesses" : 19, "hits" : 19, "misses" : 0, "resets" : 0, "missRatio" : 0.0 },
"locks" : { "." : {
"timeLockedMicros" : { "R" : 435761, "W" : 5334268 },
"timeAcquiringMicros" : { "R" : 4899977, "W" : 2994540 } },
"admin" : { "timeLockedMicros" : { "r" : 151982, "w" : 0 },
"timeAcquiringMicros" : { "r" : 369253, "w" : 0 } },
"local" : { "timeLockedMicros" : { "r" : 128739, "w" : 83 }, "timeAcquiringMicros" : { "r" : 54838, "w" : 1 } },
"testdb" : { "timeLockedMicros" : { "r" : 2081468, "w" : 130 }, "timeAcquiringMicros" : { "r" : 19698, "w" : 3 } },
"mongodb" : { "timeLockedMicros" : { "r" : 191151, "w" : 128 }, "timeAcquiringMicros" : { "r" : 30413, "w" : 4 } },
"db_name" : { "timeLockedMicros" : { "r" : 375654, "w" : 908 }, "timeAcquiringMicros" : { "r" : 14419, "w" : 40 } },
"Barca" : { "timeLockedMicros" : { "r" : 158307, "w" : 134 }, "timeAcquiringMicros" : { "r" : 19699, "w" : 3 } },
"dbs" : { "timeLockedMicros" : { "r" : 610389, "w" : 224 }, "timeAcquiringMicros" : { "r" : 17663, "w" : 6 } },
"test1" : { "timeLockedMicros" : { "r" : 829203, "w" : 28 }, "timeAcquiringMicros" : { "r" : 15951, "w" : 2 } },
"yekai" : { "timeLockedMicros" : { "r" : 2065973, "w" : 269 }, "timeAcquiringMicros" : { "r" : 61179, "w" : 4 } },
"tutorial" : { "timeLockedMicros" : { "r" : 1491259, "w" : 157 }, "timeAcquiringMicros" : { "r" : 28555, "w" : 3 } } },
"network" : { "bytesIn" : 5730, "bytesOut" : 13310, "numRequests" : 44 },
"opcounters" : { "insert" : 9, "query" : 3641, "update" : 0, "delete" : 0, "getmore" : 0, "command" : 38 },
"opcountersRepl" : { "insert" : 0, "query" : 0, "update" : 0, "delete" : 0, "getmore" : 0, "command" : 0 },
"recordStats" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0,
"Barca" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"admin" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"db_name" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"dbs" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"local" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"mongodb" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"test1" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"testdb" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"tutorial" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 },
"yekai" : { "accessesNotInMemory" : 0, "pageFaultExceptionsThrown" : 0 } },
"writeBacksQueued" : false,
"mem" : { "bits" : 64, "resident" : 158, "virtual" : 62683, "supported" : true, "mapped" : 31251, "mappedWithJournal" : 62502 },
"metrics" : { "cursor" : { "timedOut" : 0, "open" : { "noTimeout" : 0, "pinned" : 0, "total" : 0 } },
"document" : { "deleted" : 0, "inserted" : 9, "returned" : 0, "updated" : 0 },
"getLastError" : { "wtime" : { "num" : 0, "totalMillis" : 0 }, "wtimeouts" : 0 },
"operation" : { "fastmod" : 0, "idhack" : 0, "scanAndOrder" : 0 },
"queryExecutor" : { "scanned" : 0, "scannedObjects" : 0 },
"record" : { "moves" : 0 },
"repl" : {
"apply" : { "batches" : { "num" : 0, "totalMillis" : 0 }, "ops" : 0 },
"buffer" : { "count" : 0, "maxSizeBytes" : 268435456, "sizeBytes" : 0 },
"network" : { "bytes" : 0, "getmores" : { "num" : 0, "totalMillis" : 0 }, "ops" : 0, "readersCreated" : 0 },
"preload" : { "docs" : { "num" : 0, "totalMillis" : 0 }, "indexes" : { "num" : 0, "totalMillis" : 0 } } },
"storage" : { "freelist" : { "search" : { "bucketExhausted" : 0, "requests" : 8, "scanned" : 16 } } },
"ttl" : { "deletedDocuments" : 0, "passes" : 364 } },
"ok" : 1.0 }
*/
// cmd : ismaster
retval = DbOptExec_command_simple(client, "admin", "ismaster", &error);
if (!retval) {
ShowErrMsg("ismaster", &error);
}
/**
[ismaster] {
"ismaster" : true,
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : { "$date" : 1491230240360 },
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1.0
}
*/
// cmd : getlasterror
retval = DbOptExec_command_simple(client, "admin", "getlasterror", &error);
if (!retval) {
ShowErrMsg("getlasterror", &error);
}
/**
[getlasterror] {
"connectionId" : 11,
"n" : 0,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1.0
}
*/
// cmd : foo
retval = DbOptExec_command_simple(client, "admin", "foo", &error);
if (!retval) {
ShowErrMsg("foo", &error);
}
/**
[foo] error : no such cmd: foo
*/
// cmd : empty
// 空命令会报错的
// retval = DbOptExec_command_simple(client, "admin", "{}", &error);
//
// if (!retval) {
// ShowErrMsg("{}", &error);
// }
// cmd : empty
retval = DbOptExec_command_simple(client, "admin", "", &error);
if (!retval) {
ShowErrMsg("", &error);
}
/**
[] error : no such cmd:
*/
// cmd : db
retval = DbOptExec_command_simple(client, "admin", "db", &error);
if (!retval) {
ShowErrMsg("db", &error);
}
/**
[db] error : no such cmd: db
*/
/**
MongoDB shell version: 2.6.10
connecting to: test
> show dbs
Barca 0.078GB
admin 0.078GB
db_name 0.078GB
local 0.078GB
mongodb 0.078GB
test1 0.078GB
testdb 0.078GB
tutorial 0.078GB
yekai 7.950GB
>
> use test1
switched to db test1
> show collections
system.indexes
test1
>
*/
// cmd : "{'drop': '%s'}"
retval = DbOptExec_command_simple(client, "admin", "use", "test1", &error);
if (!retval) {
ShowErrMsg("use test1", &error);
}
/**
[use test1] error : no such cmd: use
*/
retval = DbOptExec_command_simple(client, "test1", "drop", "test1", &error);
if (!retval) {
ShowErrMsg("drop test1", &error);
}
/**
[drop] { "ns" : "test1.test1", "nIndexesWas" : 1, "ok" : 1.0 }
*/
/** mongo console
> use test1
switched to db test1
> show collections
system.indexes
>
*/
// cmd : getCmdLineOpts
retval = DbOptExec_command_simple(client, "admin", "getCmdLineOpts", &error);
if (!retval) {
ShowErrMsg("getCmdLineOpts", &error);
}
/**
[getCmdLineOpts] {
"argv" : [ "\/usr\/local\/mongodb\/bin\/mongod", "--config", "\/usr\/local\/mongodb\/bin\/mongodb.conf" ],
"parsed" : {
"config" : "\/usr\/local\/mongodb\/bin\/mongodb.conf",
"net" : { "http" : { "enabled" : false }, "port" : 27017 },
"processManagement" : { "fork" : true },
"storage" : { "dbPath" : "\/usr\/local\/mongodb\/db" },
"systemLog" : { "destination" : "file", "path" : "\/usr\/local\/mongodb\/logs\/mongodb.log" }
},
"ok" : 1.0
}
*/
mongoc_collection_destroy(collection);
mongoc_database_destroy(database);
mongoc_client_destroy(client);
mongoc_cleanup();
return 0;
}