Scroll to navigation

CLIENT_SIDE_DOCUMENT_MATCHING(3) Library Functions Manual CLIENT_SIDE_DOCUMENT_MATCHING(3)

NAME

Client_Side_Document_Matching - None

BASIC DOCUMENT MATCHING (DEPRECATED)

NOTE
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.

EXAMPLE-MATCHER.C

#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_json (doc, NULL);
   str2 = bson_as_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.

FILTER-BSONDUMP.C

/*
 * 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_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" }

COLOPHON

This page is part of MongoDB C Driver. Please report any bugs at https://jira.mongodb.org/browse/CDRIVER.
2016‐10‐12 MongoDB C Driver