2012-05-04 3 views
1

Я пытаюсь подражать следующий MongoDB шеллкода:

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); 

Но это, кажется, не работайте, как ожидалось. Я также попытался заменить объект массивом, а затем вложил массив в объект, но безрезультатно.

+0

$ или нужен массив объектов. Не могли бы вы изменить свой вопрос, чтобы показать, как вы пытались использовать массив объектов? Помните, что существует 3 уровня: запрос верхнего уровня, поле массива $ или или вложенный объект для каждого предложения внутри массива. Также, пожалуйста, опубликуйте вывод bson_print() в своем запросе, чтобы упростить отладку. – mstearn

ответ

3

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); 
0

У меня на самом деле нет опыта работы с драйвером 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, я не могу найти пример создания открытого " массив объектов ". Поэтому, если это не сработает, вам может потребоваться связаться с автором драйвера или группами Google MongoDB.

+0

Спасибо за подсказку. Я узнал, что вам нужно вставить объекты внутри массива и объявить их с помощью соответствующих функций. –

Смежные вопросы