mongoc驱动程序:如何基于ISOdate进行查询?

时间:2017-03-31 19:24:07

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

我有一个简单的查询,可以在mongodb shell上运行:

db.collection.find({"date": {$lt: ISODate("2015-11-03T00:00:00Z")} })

非常简单,只是想找到2015-11-03之前的任何记录。现在我想转换为mongoc驱动程序中的类似代码,我有以下代码不起作用:

query = BCON_NEW (
   "date", "{", "$lt", "2015-11-03T00:00:00Z", "}", "}");    
cursor = mongoc_collection_find (collection, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL);

有谁知道用mongoc写的正确方法?我查看了mongoc.org,没有相关的例子。

1 个答案:

答案 0 :(得分:2)

BCON非常敏感,但是一旦掌握了它,它就非常有用了

首先,您需要将BCON类型应用于任何不是键的东西,并仔细计算您的大括号。每个开口支架都需要一个闭合支架。 BCON_NEW本身将处理文档中的第一个也是最后一个大括号。

query = BCON_NEW ("date", "{", "$lt", "2015-11-03T00:00:00Z", "}", "}"); 
                    ^             ^              ^                  ^
                    |             |              |                  |
keys ------------------------------              |                  |
value --------------------------------------------                  |
brace that shouldn't exist ------------------------------------------

此页面将告诉您可能要为您的值选择的透视类型

https://github.com/mongodb/libbson/blob/master/src/bson/bcon.c#L214-L292

您的收藏集称其拥有ISODate,因此您需要BCON_DATE_TIME类型。

切换类型并摆脱额外的尾随右括号,你的查询可能需要看起来像这样。

query = BCON_NEW ("date", "{", "$lt", BCON_DATE_TIME("2015-11-03T00:00:00Z"), "}");