Я использую MongoDB для хранения записей сведений о вызовах, которые состоят из А-ножек и В-ножек.
Они связаны следующим образом:
- Все записи (A & B-ноги) находятся в одной
cdr
коллекции
- А-ноги имеют поле
leg_type
, равное a
, B-ноги имеют b
, конечно
- B-ноги имеют поле
a_leg
, чтобы указать, к какой A-ноге они принадлежат.
В данный момент мы получаем нужные нам A-ветви, затем перебираем их, и для каждой A-ветви мы получаем соответствующие B-ветви (может быть несколько), поэтому все на стороне клиента.
Мне было интересно, смогу ли я сделать это в одном запросе, и, очевидно, вы можете это сделать с помощью $ lookup (aggregation) . Однако в данном случае, по-видимому, необходимо указывать поле на А-ветви, которое будет представлять собой массив В-ветвей.
Но у меня нет этого поля, и прежде чем я потратил ненужное время, чтобы получить такое поле, мне было интересно, могу ли я сделать это по-другому.
Для полноты, вот как мы сейчас получаем CDR:
a_legs = mongo_db['cdr'] \
.find({'group_id': group.id, 'leg_type': 'a'}) \
.sort('times.created', pymongo.DESCENDING) \
.limit(50)
for cdr in a_legs:
# Find B-legs
cdr['b_legs'] = mongo_db['cdr'] \
.find({'a_leg': cdr['call_id'], 'leg_type': 'b'}) \
.sort('times.created', pymongo.ASCENDING)
Итак, основной вопрос: можем ли мы сделать вышеупомянутое в одном запросе к MongoDB?
Я пытался сделать это так:
db.cdr.aggregate([{
$lookup: {
from: "cdr",
localField: "call_id",
foreignField: "a_leg",
as: "b_legs"
}
}])
Но это не показывает мне никаких результатов.