#c #mongodb
#c #mongodb
Вопрос:
Я пытаюсь применить проекцию с использованием $ elemMatch с драйвером MongoDB C (совместимость 2.6):
Пример документа:
{
"name" : "Tom",
"lists" : [
{"value" : 1}, {"value" : 2}, {"value" : 3}
]
}
Я хотел бы получить документ для Tom и ТОЛЬКО значение 1.
В командной оболочке это будет выглядеть следующим образом:
> db.aaa.find({"name" : "Tom", "lists.value" : 1}, {"lists" : {$elemMatch : {"value" : 1} } })
Теперь нет подходящего переопределения над query
методом, который принимает BSONObj
для проекционной части запроса. Я что-то здесь упускаю?
Помощь будет высоко оценена!
Ответ №1:
вы захотите использовать метод DBClientBase::query(). Он имеет такую подпись:
auto_ptr<DBClientCursor> DBClientBase::query(
const string amp;ns,
Query query,
int nToReturn,
int nToSkip,
const BSONObj *fieldsToReturn,
int queryOptions,
int batchSize
)
В драйвере C , совместимом с 2.6, нет классов базы данных или коллекции, поэтому вам необходимо предоставить:
- пространство имен для запроса (ns)
- сам запрос (query)
- количество документов, которые нужно вернуть,
- число, которое нужно пропустить (передать ноль для значений по умолчанию)
- fieldsToReturn (BSONObj, представляющий поля, которые вы хотели бы вернуть из базы данных.
Так, например, если бы вы хотели сделать то же самое, что указано выше, вы бы написали запрос следующим образом:
DBClientConnection conn;
conn.connect("localhost:27017");
BSONOBj projection = fromjson("{ lists: {"$elemMatch:": {value: 1} } }");
conn.query("db.aaa", Query("{}"), 0, 0, amp;projection)
Комментарии:
1. Не удалось 1 вашего решения, недостаточно репутации 🙂 В любом случае, это сработало, за исключением того, что вторым аргументом должен быть BSONObj, часть «fromjson» должна передаваться по ссылке, и вы забыли поместить значения в QueryOptions и BatchSize .
2. Да, я просто хотел передать вам суть этого. Последние два аргумента на самом деле имеют значения по умолчанию, поэтому они вам не нужны, и query может быть объектом запроса (который проще в использовании). Спасибо за другие отзывы, я обновлю их. (обновление: ОБНОВЛЕНО)