使用C Driver在mongoDb的两个日期之间获取数据

时间:2016-04-18 07:12:12

标签: c mongodb mongodb-query bson mongo-c-driver

我插入了这样的数据

  

{" userid" :" manaf",     " DataValue" :{" $ type" :" 00"," $ binary" :" sampleBinaryData" },      "时间戳" :1460718961132,      " _id" :{" $ oid" :" 5710cd7194e5f57831eea91e" },      " __ V" :0     }

我需要提供数据b / w时间戳值。

我已经通过在mongoDb客户端控制台中使用以下命令来完成此操作。

  

db.sampleCollection.find({" timestamp":{" $ gte":1460703944149," $ lt":1460703944683}," userid& #34;:" manaf"})

但是我不能在我的c程序中使用这个。

这是我的客户端程序

#include <bson.h>
  #include <mongoc.h>
  #include <stdio.h>

  int
  main (int   argc,
        char *argv[])
  {
      mongoc_client_t *client;
      mongoc_collection_t *collection;
      mongoc_cursor_t *cursor;
      const bson_t *doc;
      bson_t *query;
      char *str;

      mongoc_init ();

      client = mongoc_client_new ("mongodb://localhost:27017/");
      collection = mongoc_client_get_collection (client, "sampledb", "sampleCollection");
      query = bson_new ();
      BSON_APPEND_UTF8 (query, "timestamp": {"$gte":1460703944149, "$lt":1460703944683 },"userid": "manaf");

      cursor = mongoc_collection_find (collection, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL);
      printf("Started\n");
            while (mongoc_cursor_next (cursor, &doc)) {
          str = bson_as_json (doc, NULL);
          printf ("%s\n", str);
          bson_free (str);
      }

      bson_destroy (query);
      mongoc_cursor_destroy (cursor);
      mongoc_collection_destroy (collection);
      mongoc_client_destroy (client);
      mongoc_cleanup ();

      return 0;
  }

我有这样的错误

error: macro "BSON_APPEND_UTF8" passed 4 arguments, but takes just 3
       BSON_APPEND_UTF8 (query, "timestamp": {"$gte":1460703944149, "$lt":1460703944683 },"userid": "manaf");

这个程序的实际问题是什么?

3 个答案:

答案 0 :(得分:0)

可能需要$和查询。如果BCON可用,请使用它。

#include <bson.h>
#include <bcon.h>

...

    query = BCON_NEW("$and","[",
                     "{", "timestamp", "{", "$gte", BCON_INT64(1460703944149), "}", "}",
                     "{", "timestamp", "{", "$lt", BCON_INT64(1460703944683), "}", "}","]");

...

答案 1 :(得分:0)

我知道这是一个古老的问题,但我想简单介绍一些可能有用的要点。

首先,我认为这可能更容易用BCON(基本文档here)进行可视化,但我相信问题中引用的特定错误是由于{{内部存在额外的逗号“ 1}} document(这一个:timestamp。这个逗号在JSON中很好,但它会使宏失败,因为它认为你现在正在发送下一个参数。你可以用所描述的技术克服它here,但我相信一旦解决了问题,您仍然会遇到问题,因为看起来BSON_APPEND_UTF8签名需要指向您的文档的指针,然后是密钥,然后是UTF8字符串值。 tutorial

  

此示例添加了对BSON_APPEND_UTF8()的调用以查找匹配{&#34; hello&#34; :&#34;世界&#34;} ...

     

{"$gte":1460703944149, "$lt":1460703944683 }

但是,在这里,您希望将BSON_APPEND_UTF8 (query, "hello", "world");字段设置为文档,而不是UTF8值。您提供的文档将包含timestamp字段和$gte字段设置为您的日期/时间范围。您还需要将$lt字段添加到查询文档中,然后您应该已经完成​​了可以发送的查询。

使用userId方法,我相信您可以执行以下操作来完成此操作(我没有测试过此代码,但我认为它应该非常接近):

bson_append_<insert datatype here>

或者,使用BCON:

bson_t *query;
bson_t timestampDoc;

query = bson_new();

BSON_APPEND_DOCUMENT_BEGIN(query, "timestamp", &timestampDoc);
bson_append_date_time(&timestampDoc, "$gte", -1, 1460703944149);
bson_append_date_time(&timestampDoc, "$lt", -1, 1460703944683);
bson_append_document_end(query, &timestampDoc);
BSON_APPEND_UTF8(query, "userId", "manaf");

答案 2 :(得分:-1)

您可以更改宏BSON_APPEND_UTF8的参数,如下所示

BSON_APPEND_UTF8 (query, "\"timestamp\": {\"$gte\":1460703944149, \"$lt\":1460703944683 }","\"userid\": \"manaf\"");