Выполнение запросов с несколькими предикатами для подобъектов в коллекции с помощью MongoDB (официальный драйвер c #) - PullRequest
2 голосов
/ 26 июня 2011

У меня следующая структура данных:

  • A
    • _id
    • B []
      • _id
      • С []
        • _id
        • UserId

Я пытаюсь выполнить следующий запрос:

where a.B._id == 'some-id' and a.B.C.UserId=='some-user-id'.

Это означает, что мне нужно найти документ B, в котором есть документ C с соответствующим UserId, что-то вроде:

Query.And(Query.EQ("B._id", id), Query.EQ("B.C.UserId", userId));

Это, конечно, нехорошо, так как он может найти B с этим идентификатором и другой другой B, имеющий C с этим UserId. Не хорошо.

Как мне написать это с официальным драйвером?

1 Ответ

3 голосов
/ 27 июня 2011

Если проблема заключается только в том, что ваши два предиката в B оцениваются в разных экземплярах B («он может найти B с этим идентификатором и другой другой B, имеющий C с этим идентификатором пользователя»), тогда решение заключается в использовании операторачто говорит "найди мне предмет в коллекции, который удовлетворяет обоим этим предикатам вместе".

Похоже, что оператор $ elemMatch делает именно это.Из документов:

Используйте $ elemMatch, чтобы проверить, соответствует ли элемент в массиве указанному выражению соответствия.[...]
Обратите внимание, что один элемент массива должен соответствовать всем указанным критериям;[...]
Это необходимо использовать только в том случае, если в элементе массива должно быть найдено более 1 поля.

Попробуйте:

Query.ElemMatch("B", Query.And(
  Query.EQ("_id", id),
  Query.EQ("C.UserId", userId)
));

Вотхорошее объяснение $ elemMatch и точечной нотации , которое точно соответствует этому сценарию.

...