前言
使用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;
}