在新的C驱动程序中使用$or和$and的MongoDB

在新的C驱动程序中使用$or和$and的MongoDB,mongodb,mongodb-query,bson,mongodb-c,Mongodb,Mongodb Query,Bson,Mongodb C,我试图模拟以下MongoDB外壳代码: db.collection.find( { $and: [ { $or: [ { document: { field: "X" } }, { field: "X" } ] }, { _id: ObjectId("X") } ] } ); 这就是我尝试过的(使用新的MongoDB-C-Driver): 先谢谢你 致以最诚挚的问候。用于创建嵌套文档的libbson命令式API有点棘手,不幸的是,您遇到了一个容易犯的错误。使用bson\u append\u d

我试图模拟以下MongoDB外壳代码:

db.collection.find( { $and: [ { $or: [ { document: { field: "X" } }, { field: "X" } ] }, { _id: ObjectId("X") } ] } );
这就是我尝试过的(使用新的MongoDB-C-Driver):

先谢谢你


致以最诚挚的问候。

用于创建嵌套文档的libbson命令式API有点棘手,不幸的是,您遇到了一个容易犯的错误。使用bson\u append\u document\u begin或bson\u append\u array\u begin打开子文档后,在执行相应的_end()调用之前,不得对其进行写入。在本例中,在写入“查询”的“或”文档中添加了\u utf8()调用

对于BSON组成的一种更简单的方法,考虑使用BCONAPI,它提供了一个具有最小开销的声明性语法:

BCON_APPEND(&other_query,
    "$and", "{",
        "_id", BCON_OID(&oid),
        "$or", "{",
            "field", "X",
        "}",
        "$or", "{",
            "document.field", "X",
        "}",
    "}");
使用bcon api可能也会给您一个提示,即您没有完全复制您认为自己是的内容

要生成您在shell中看到的bson,请执行以下操作:

BCON_APPEND(&correct_query,
    "$and",
    "[",
        "{", "$or", "[",
            "{", "document", "{", "field", "X", "}", "}",
            "{", "field", "X", "}",
        "]", "}",
        "{", "_id", BCON_OID(&oid), "}",
    "]"
);
您还可以使用bson_as_json()函数将bson文档字符串化为json,这样可以更容易地查看您构建的对象

iterative: { "$and" : { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" }, "$or" : { "field" : "X" }, "$or" : { "document.field" : "X" } } }
bcon: { "$and" : { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" }, "$or" : { "field" : "X" }, "$or" : { "document.field" : "X" } } }
correct: { "$and" : [ { "$or" : [ { "document" : { "field" : "X" } }, { "field" : "X" } ] }, { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" } } ] }

相关文档:

如果您可以更具体一些,帮助您会更容易-这段代码有效吗?如果不是,它是否产生了错误或只是不正确的结果?此代码不会导致错误,但mongoc_cursor_next()函数的结果始终为false。。。
iterative: { "$and" : { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" }, "$or" : { "field" : "X" }, "$or" : { "document.field" : "X" } } }
bcon: { "$and" : { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" }, "$or" : { "field" : "X" }, "$or" : { "document.field" : "X" } } }
correct: { "$and" : [ { "$or" : [ { "document" : { "field" : "X" } }, { "field" : "X" } ] }, { "_id" : { "$oid" : "53ff00f4342d8c1c712b4841" } } ] }