【问题标题】:MongoDB retrieve records using $or in CMongoDB 在 C 中使用 $or 检索记录
【发布时间】:2012-05-04 16:27:15
【问题描述】:

我正在尝试模拟以下 MongoDB shellcode:

db.products.find( { $or : [ { title : /blue/i }, { tags : /blue/i } ] }, {_id:0, title:1} );

这是我尝试过的:

bson query[1];
mongo_cursor cursor[1];

bson_init( query );

{
bson_append_start_object( query, "$or");
bson_append_regex( query, "title", "blue", "i" );
bson_append_regex( query, "tags", "blue", "i" );
bson_append_finish_object( query );
}

bson_finish( query );

mongo_cursor_init( cursor, conn, "test.products" );
mongo_cursor_set_query( cursor, query );

while( mongo_cursor_next( cursor ) == MONGO_OK ) {
  bson_iterator iterator[1];
  if ( bson_find( iterator, mongo_cursor_bson( cursor ), "title" )) {
      printf( "%s\n", bson_iterator_string( iterator ) );
  }
}

bson_destroy( query );
mongo_cursor_destroy( cursor );

但它似乎没有按预期工作。我也尝试用数组替换对象,然后将数组嵌套在对象中,但无济于事。

【问题讨论】:

  • $or 需要一个对象数组。您能否编辑您的问题以显示您如何尝试使用对象数组?请记住,有 3 个级别:顶级查询、$or 的数组字段以及数组内每个子句的嵌套对象。另外,请在您的查询中发布 bson_print() 的输出,以便于调试。

标签: c mongodb mongodb-query mongodb-c


【解决方案1】:

mongo_db 答案

好的,我在这个网站上找到了解决方案:

https://groups.google.com/group/mongodb-user/browse_thread/thread/02a239b0bda84b82

这是我必须改变的:

bson_append_start_object( query, "$or");
bson_append_regex( query, "title", "blue", "i" );
bson_append_regex( query, "tags", "blue", "i" );
bson_append_finish_object( query );

应该是

bson_append_start_array( query, "$or" );
    bson_append_start_object( query, "0"); 
        bson_append_regex( query, "title", "blue", "i" );
    bson_append_finish_object( query );     
    bson_append_start_object( query, "1"); 
        bson_append_regex( query, "tags", "blue", "i" );
    bson_append_finish_object( query );
bson_append_finish_array( query );

【讨论】:

    【解决方案2】:

    我对 C 驱动程序不是很熟悉,但您的基本查询结构似乎有问题。

    顺序应该是这样的:

    array => add Object {title:/blue/i} to array
          => add Object {tags:/blue/i} to array
    finish array
    

    所以代码应该是这样的:

    bson_init(query);
    
    bson_append_start_array( query, "$or" );
      bson_append_regex( query, "title", "blue", "i" );
      bson_append_regex( query, "tags", "blue", "i" );
    bson_append_finish_array( query );
    

    但是,查看the docs,我找不到构建“对象数组”的示例。因此,如果这不起作用,您可能需要联系驱动程序作者或 MongoDB Google Groups。

    【讨论】:

    • 感谢您的提示。我了解到您需要在数组中插入对象并使用适当的函数声明它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多