документ:MongoDB - выполнить подзапрос
{ "_id":1, "id":1, "list" : [ { "lv" : 1 , "id":1}, {"lv" : 2 , "id":2} ] }
Я хочу, чтобы сделать поиск ({ "_ идентификатор": 1}, { "ID": 1, "list.lv": 1}), но предел {» list.lv ": 1} с дополнительным условием:" list.id = id ". Это означает, что я хочу только получить «id» и «list.lv» часть первого элемента в списке, потому что его «list.id» == «id» == 1
Обычно значение условия, указанное в коде , но в этом примере значение находится в документе. SQL делает это путем подзапроса или таблицы соединений. Поддерживает ли mongodb это в одном запросе? И как написать его в C++-драйвере?
Согласно ответу, добавьте C++ код:
mongo::BSONObj res;
std::vector<mongo::BSONObj> pipeline;
pipeline.push_back(BSON("$match"<<BSON("_id"<<1)));
pipeline.push_back(BSON("$unwind"<<"$list"));
mongo::BSONArrayBuilder ab;
ab<<"$id"<<"$list.id";
pipeline.push_back(BSON("$project"<<BSON("id"<<1<<"list.lv"<<1<<"equalsFlag"<<BSON("$subtract"<<ab.arr()))));
pipeline.push_back(BSON("$match"<<BSON("equalsFlag"<<0)));
pipeline.push_back(BSON("$project"<<BSON("id"<<1<<"list.lv"<<1)));
conn->runCommand("db_name", BSON("aggregate" << "collection_name" << "pipeline" << pipeline), res);
std::cout<<res["result"].Array()[0].Obj().getObjectField("list").getIntField("lv");
Работает. И я также добавляю код кода C++ в свой вопрос. – jean
Несомненно. Готово! –