mongo c 驱动程序:如何查询列表中带有“_id”的文档?
mongo c driver: how to query documents with "_id" in a list?
我有一个包含大量文档的数据库,我只想从列表中查询带有“_id”的文档。我在网上搜索了几个小时,没有找到任何真正有用的东西,所以我 post 我的问题在这里。非常感谢您的帮助!
在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);
None 其中 returns 任何文档。
再次感谢您提前提出任何建议、意见!
编辑:
我自己回答了我原来的问题(见下面的答案)。但是,如果我想动态形成查询,换句话说,用例是我从其他地方获取 id 列表,在形成查询之前,我不知道 id 是什么,我只知道它们会在容器中传递给我,比如 std::vector,我如何动态地形成这个查询?
更新:
终于,我找到了问题的完整解决方案。
bson_init_from_json(qry,
"{\"_id\":{\"$in\":
[{\"$oid\":\"595320c208b0c52a8b37c151\"},
{\"$oid\":\"595320c208b0c52a8b37c152\"},
{\"$oid\":\"595320c208b0c52a8b37c153\"}]}}",
-1,
NULL);
由于上面的查询是由字符串构成的,可以动态更新,彻底解决了我的问题!
经过进一步调查,我自己找到了问题的答案。与其直接使用 oid 变量或使用字符串,不如使用函数 BCON_OID。以下查询有助于获取我想要的内容:
qry = BCON_NEW("$query", "{", "name", "{", "$in", "[",
BCON_OID(oid1), BCON_OID(oid2), BCON_OID(oid3), "]", "}", "}");
我有一个包含大量文档的数据库,我只想从列表中查询带有“_id”的文档。我在网上搜索了几个小时,没有找到任何真正有用的东西,所以我 post 我的问题在这里。非常感谢您的帮助!
在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);
None 其中 returns 任何文档。
再次感谢您提前提出任何建议、意见!
编辑:
我自己回答了我原来的问题(见下面的答案)。但是,如果我想动态形成查询,换句话说,用例是我从其他地方获取 id 列表,在形成查询之前,我不知道 id 是什么,我只知道它们会在容器中传递给我,比如 std::vector
更新:
终于,我找到了问题的完整解决方案。
bson_init_from_json(qry,
"{\"_id\":{\"$in\":
[{\"$oid\":\"595320c208b0c52a8b37c151\"},
{\"$oid\":\"595320c208b0c52a8b37c152\"},
{\"$oid\":\"595320c208b0c52a8b37c153\"}]}}",
-1,
NULL);
由于上面的查询是由字符串构成的,可以动态更新,彻底解决了我的问题!
经过进一步调查,我自己找到了问题的答案。与其直接使用 oid 变量或使用字符串,不如使用函数 BCON_OID。以下查询有助于获取我想要的内容:
qry = BCON_NEW("$query", "{", "name", "{", "$in", "[",
BCON_OID(oid1), BCON_OID(oid2), BCON_OID(oid3), "]", "}", "}");