2013-10-09 1 views
2

У меня есть поле под названием id (not _id) в документах из двух коллекций. Мне нужно сравнить содержимое первой коллекции со второй. В принципе, мне нужно знать, какие документы с данным значением «id» существуют в коллекции «A», но не «B». Самый простой способ построить массив id из Collection A, который я могу использовать, чтобы сделать что-то вроде следующего. :Каков самый простой способ вернуть результаты запроса для данной пары ключ/значение в mongo как массив возвращаемых значений?

db.B.find({id:{$nin: array_of_ids_from_coll_A}}) 

Пожалуйста, не зацикливаться над тем, почему я использую «идентификатор» в данном случае, а не «_id». Благодарю.

+0

mapreduce более 2 коллекций? –

ответ

0

Я неправильно предположил, что функция «отличная» возвращает набор различных документов на основе заданного «поля». Фактически, он возвращает массив различных значений, при условии определенного поля. Итак, мне удалось построить массив, который я искал с помощью db.A.distinct ('id'). Спасибо всем, кто нашел время, чтобы прочитать этот вопрос.

1

Строго говоря, это не отвечает на вопрос о том, «как построить массив, который ...», но я перебирал коллекцию A и, для каждого элемента, попытался найти совпадение в B. Если ни один не найден, добавьте в список.

У этого есть много обращений к базе данных, поэтому это не очень быстро, но это очень просто. Кроме того, если A содержит много элементов, массив идентификаторов может быть слишком большим, чтобы выбросить все из них в $nin, что в противном случае пришлось бы решить, разделив массив идентификаторов. Хуже того, $nin неэффективен с индексами.