Client Side Document Matching¶
Basic Document Matching (Deprecated)¶
Warning
This feature will be removed in version 2.0.
The MongoDB C driver supports matching a subset of the MongoDB query specification on the client.
Currently, basic numeric, string, subdocument, and array equality, $gt
, $gte
, $lt
, $lte
, $in
, $nin
, $ne
, $exists
, $type
, $and
, and $or
are supported. As this is not the same implementation as the MongoDB server, some inconsistencies may occur. Please file a bug if you find such a case.
The following example performs a basic query against a BSON document.
#include <bcon.h>
#include <mongoc.h>
#include <stdio.h>
static void
log_query (const bson_t *doc, const bson_t *query)
{
char *str1;
char *str2;
str1 = bson_as_canonical_extended_json (doc, NULL);
str2 = bson_as_canonical_extended_json (query, NULL);
printf ("Matching %s against %s\n", str2, str1);
bson_free (str1);
bson_free (str2);
}
static void
check_match (const bson_t *doc, const bson_t *query)
{
bson_error_t error;
mongoc_matcher_t *matcher = mongoc_matcher_new (query, &error);
if (!matcher) {
fprintf (stderr, "Error: %s\n", error.message);
return;
}
if (mongoc_matcher_match (matcher, doc)) {
printf (" Document matched!\n");
} else {
printf (" No match.\n");
}
mongoc_matcher_destroy (matcher);
}
static void
example (void)
{
bson_t *query;
bson_t *doc;
doc = BCON_NEW ("hello", "[", "{", "foo", BCON_UTF8 ("bar"), "}", "]");
query = BCON_NEW ("hello.0.foo", BCON_UTF8 ("bar"));
log_query (doc, query);
check_match (doc, query);
bson_destroy (doc);
bson_destroy (query);
/* i is > 1 or i < -1. */
query = BCON_NEW ("$or",
"[",
"{",
"i",
"{",
"$gt",
BCON_INT32 (1),
"}",
"}",
"{",
"i",
"{",
"$lt",
BCON_INT32 (-1),
"}",
"}",
"]");
doc = BCON_NEW ("i", BCON_INT32 (2));
log_query (doc, query);
check_match (doc, query);
bson_destroy (doc);
doc = BCON_NEW ("i", BCON_INT32 (0));
log_query (doc, query);
check_match (doc, query);
bson_destroy (doc);
bson_destroy (query);
}
int
main (int argc, char *argv[])
{
mongoc_init ();
example ();
mongoc_cleanup ();
return 0;
}
The following example shows how to process a BSON stream from stdin
and match it against a query. This can be useful if you need to perform simple matching against mongodump
backups.
/*
* Copyright 2014 MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <bcon.h>
#include <bson.h>
#include <mongoc.h>
#include <stdio.h>
/*
* This is an example that reads BSON documents from STDIN and prints them
* to standard output as JSON if they match {'hello': 'world'}.
*/
int
main (int argc, char *argv[])
{
mongoc_matcher_t *matcher;
bson_reader_t *reader;
const bson_t *bson;
bson_t *spec;
char *str;
int fd;
mongoc_init ();
#ifdef _WIN32
fd = fileno (stdin);
#else
fd = STDIN_FILENO;
#endif
reader = bson_reader_new_from_fd (fd, false);
spec = BCON_NEW ("hello", "world");
matcher = mongoc_matcher_new (spec, NULL);
while ((bson = bson_reader_read (reader, NULL))) {
if (mongoc_matcher_match (matcher, bson)) {
str = bson_as_canonical_extended_json (bson, NULL);
printf ("%s\n", str);
bson_free (str);
}
}
bson_reader_destroy (reader);
bson_destroy (spec);
return 0;
}
To test this, perform a mongodump
of a single collection and pipe it to the program.
$ echo "db.test.insert({hello:'world'})" | mongo
MongoDB shell version: 2.6.1
connecting to: test
WriteResult({ "nInserted" : 1 })
bye
$ mongodump -d test -c test -o - | filter-bsondump
{ "_id" : { "$oid" : "537afac9a70e5b4d556153bc" }, "hello" : "world" }