0

私のmongodbデータベースからいくつかのデータを取得する必要があるクエリを作成しようとしています.私のコードに従ってください:

 72     mongo conn[1];
 73     mongo_cursor cursor[1];
 74 
 75     //Parameters (connection, IP, port);
 76     int status = mongo_connect(conn, "127.0.0.1", 27017);
 77     if(status != MONGO_OK){
 78         switch(conn->err){
 79             case MONGO_CONN_NO_SOCKET: printf("Socket not found\n"); return 1;
 80             case MONGO_CONN_FAIL: printf("Connection Failed\n"); return 1;
 81             case MONGO_CONN_NOT_MASTER: printf("Not master\n"); return 1;
 82         }
 83     }
 84 
 85     //add_new_service(conn, 55, 75,"java","7");
 86     bson query[1];
 87     bson_init(query);
 88     bson_append_start_object(query, "$query");
 89         bson_append_int(query,"cpu",75);
 90     bson_append_finish_object(query);
 91     bson_finish(query);
 92 
 93     bson fields[1];
 94     bson_init(fields);
 95     bson_append_null(fields,"machine");
 96     bson_finish(fields);
 97 
 98     mongo_cursor_init(cursor, conn, "db.services");
 99 
100     cursor = mongo_find(conn,"db.services", query, fields, 9999, 0, 0);
101 
102     while(mongo_cursor_next(ptr_cursor) == MONGO_OK){
103         bson_print(&ptr_cursor->current);
104     }
105 
106     mongo_cursor_destroy(cursor);
107     mongo_destroy(conn);
108     return 0;

メソッド「mongo_find」(100 行目) の使用方法がわかりません。mongo_cursor へのポインターを返しますが、このポインターを操作できません。これを実現するためのアイデアはありますか?

4

2 に答える 2

2

以下は、私があなたが望むと思うことを行う作業コードです。次の点に注意してください:

  1. 演算子またはコマンドとしての $query は存在しません。BSON の内部部分を使用してください
  2. 「cpu」は「machine」のサブドキュメントにあるため、クエリは「machine.cpu」を使用します
  3. フィールドについては、bson_append_null の代わりに bson_append_bool に変更したので、以下の bson_find の結果が得られます
  4. bson_find の場合、「cpu」を含むサブドキュメントであるため、マシンに移動する必要があります。

これがあなたを前進させることを願っています。

#include "mongo.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

main(int argc, char** argv)
{
    mongo conn[1];
    mongo_cursor* cursor;

    //Parameters (connection, IP, port);
    int status = mongo_connect(conn, "127.0.0.1", 27017);
    if(status != MONGO_OK){
        switch(conn->err){
            case MONGO_CONN_NO_SOCKET: printf("Socket not found\n"); return 1;
            case MONGO_CONN_FAIL: printf("Connection Failed\n"); return 1;
            case MONGO_CONN_NOT_MASTER: printf("Not master\n"); return 1;
        }
    }

    //add_new_service(conn, 55, 75,"java","7");
    bson query[1];
    bson_init(query);
    bson_append_int(query,"machine.cpu",75);
    bson_finish(query);

    bson fields[1];
    bson_init(fields);
    bson_append_bool(fields,"machine",1);
    bson_finish(fields);

    //mongo_cursor_init(cursor, conn, "db.services");

    cursor = mongo_find(conn,"db.services", query, fields, 9999, 0, 0);

    while(mongo_cursor_next(cursor) == MONGO_OK){
        bson_print(mongo_cursor_bson( cursor ));
        bson_iterator it;
        if (bson_find(&it, &cursor->current, "machine")){
            bson sub;
            bson_iterator_subobject( &it, &sub );
            if (bson_find(&it, &sub, "cpu")){
                printf("bson find cpu: %d\n", bson_iterator_int(&it));
            }
        }
    }

    mongo_cursor_destroy(cursor);
    mongo_destroy(conn);
    return 0;
}

出力

    _id : 7      4fc51ba2db00e4ba36334713
    machine : 3
        cpu : 16     75
        ram : 16     55

bson find cpu: 75
于 2012-05-30T19:44:21.103 に答える
0

ptr_cursor宣言はどこにありますか?あなたはこれを使うことができます:

while( mongo_cursor_next( &cursor ) ) 
{
    bson_print(cursor.current);

    bson_iterator iter;

    if ( bson_find( &iter, &cursor.current, "***table attribute***" )
    {
        printf("%s", bson_iterator_string(&iter));
    }
}
于 2012-05-30T16:14:25.147 に答える