mongo c driver:如何使用" _id"查询文档在列表中?

时间:2017-06-28 04:00:51

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

我有一个包含大量文档的数据库,我只想用" _id"来查询文档。从列表中。我在网上搜索了几个小时,但没有发现任何真正有用的东西,所以我在这里发帖子。非常感谢您的帮助!

在MongoDB命令行环境中,很容易实现我想要的。例如,查询命令如下:

db.collection.find({"_id":{$in:[ObjectId("595320c208b0c52a8b37c151"), ObjectId("595320c208b0c52a8b37c152"), ObjectId("595320c208b0c52a8b37c153")]}})

使用mongoc驱动程序,直接通过id检索文档也很简单。以下是一个例子:

bson_t *qry = bson_new();
BSON_APPEND_OID(qry, "_id", &oid);
mongoc_cursor_t *cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE,
                                                 0, 0, 0, qry, NULL, NULL);

要使用" _id"以外的其他键获取文档,也可以轻松实现同样的功能。以下是一个例子:

bson_t *qry = bson_new();
qry = BCON_NEW("$query", "{", "name", "{", "$in", "[",
               "Steve", "John", "Henry", "]", "}", "}");
mongoc_cursor_t *cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE,
                                                 0, 0, 0, qry, NULL, NULL);

但是,当我尝试将_id'放在数组中时,我无法正常工作。我尝试了两种不同的方式。一个是:

bson_oid_t oid1;
bson_oid_init_from_string(&oid1, "595320c208b0c52a8b37c151");
bson_oid_t oid2;
bson_oid_init_from_string(&oid2, "595320c208b0c52a8b37c152");
bson_oid_t oid3;
bson_oid_init_from_string(&oid3, "595320c208b0c52a8b37c153");
qry = BCON_NEW("$query", "{", "_id", "{", "$in", "[",
               oid1, oid2, oid3, "]", "}", "}");
mongoc_cursor_t *cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE,
                                                 0, 0, 0, qry, NULL, NULL);

另一个是:

qry = BCON_NEW("$query", "{", "_id", "{", "$in", "[",
               "ObjectId(\"595320c208b0c52a8b37c151\")",
               "ObjectId(\"595320c208b0c52a8b37c152\")",
               "ObjectId(\"595320c208b0c52a8b37c153\")", "]", "}", "}");
mongoc_cursor_t *cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE,
                                                 0, 0, 0, qry, NULL, NULL);

他们都没有返回任何文件。

再次,非常感谢您的任何建议,评论,提前!

编辑:

我自己回答了原来的问题(见下面的答案)。但是,如果我想动态地形成查询,换句话说,用例是我从其他地方获取id列表,在形成查询之前,我不知道id是什么,我只知道它们会在一个容器中传递给我,比如说std :: vector< std :: string>,我怎么能动态地形成这个查询呢?

更新

最后,我得到了解决问题的完整解决方案。

bson_init_from_json(qry,
                    "{\"_id\":{\"$in\":
                     [{\"$oid\":\"595320c208b0c52a8b37c151\"}, 
                      {\"$oid\":\"595320c208b0c52a8b37c152\"}, 
                      {\"$oid\":\"595320c208b0c52a8b37c153\"}]}}",
                    -1,
                    NULL);

由于上述查询是由字符串组成的,因此可以动态更新,从而完全解决了我的问题!

1 个答案:

答案 0 :(得分:0)

经过一番进一步的调查,我得到了自己的问题。我应该使用函数BCON_OID,而不是直接使用oid变量或使用字符串。以下查询有助于获取我想要的内容:

qry = BCON_NEW("$query", "{", "name", "{", "$in", "[",
               BCON_OID(oid1), BCON_OID(oid2), BCON_OID(oid3), "]", "}", "}");