Объединяйте и вычитайте предметы из разных коллекций - PullRequest
0 голосов
/ 03 июня 2019

Извините за невежество, я новичок в MongoDB.У меня есть коллекции деревьев, где один является надмножеством двух других, чьи элементы не перекрываются.Каждый элемент отличается уникальным идентификатором строки.То, что я хочу, - это получить элементы надмножества, которые не включены в две другие коллекции.Не могли бы вы дать мне несколько советов о том, как сделать это эффективно?

Спасибо.

РЕДАКТИРОВАТЬ:

Структура суперсет: { "_id" : 1, "str_id" : "ABC1fd3fsewer", "date": "a day" }

Структура подмножества 1: { "_id" : 1, "str_id" : "ABre1fd3fsewer", "description" : "product" }

Структура подмножества 2: { "_id" : 1, "str_id" : "ABC1fd3fsewfe"}

Каждая коллекция имеет разную структуру, но у всех есть общее поле, str_id.

РЕДАКТИРОВАТЬ Улучшено предложением @Neel У меня следующий формат:

parent = [{'str_id':'a', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'},{'str_id':'b',...},{'str_id':'c',...},{'str_id':'d',...}...]
child1 = [{'str_id':'a', 'tag2': child1_random'},{'str_id':'b', 'tag2': 'child1_random'}]
child2 = [{'str_id':'c', 'tag1':'child2_random'}]

и я хочу

outcome = [{'str_id':'c', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'},{'str_id':'d', 'tag1':'parent_random', 'tag2': 'parent_random', 'tag3':'parent_random'}]

1 Ответ

0 голосов
/ 03 июня 2019

Похоже, вам понадобится агрегатная операция.

Этот документ может помочь вам: Поиск в массиве

Вы можете выполнить несколько поисков за одну операцию агрегирования, чтобы вы могли проверить обе коллекции подмножеств.

Я предполагаю, что вы работаете с REST API и клиент отправляет запрос на подмножество документов из коллекции надмножеств. Затем вы можете отправить массив документов, который вы хотите проверить, из суперсета с клиента:

1 - сопоставить все документы в надмножестве с массивом документов, которые вы отправляете

2 - раскрутить массив расширенных документов

3 - искать коллекции подмножеств в поле "str_id" и устанавливать в поле, например "subset_one_results".

4 - выполнить операцию сопоставления с обоими результатами подмножества, которая возвращает пустой массив, скажем, «subset_one_results» ... это будет соответствовать всем документам надмножества, которые не содержатся в подмножестве 1, например.

$match({ $and : { "subset_one_results" : { $eq : [] } }, { "subset_two_results" : { $eq : [] } } })

5 - сгруппировать их в новый массив, если вы хотите вернуть их как массив клиенту.

Чтобы повысить производительность ваших операций, вы должны определить, как часто будет выполняться этот запрос. Если это часто случается, обязательно создайте индекс для поля, которое будет запрашиваться, если это , а не поле ObjectId. По вашему коду я не могу сказать, используете ли вы пользовательское строковое поле или ObjectId, поэтому я поднимаю этот вопрос.

Я не знаю, что вы используете для выполнения ваших запросов (чистый язык запросов MongoDB, драйвер и т. Д.), Поэтому я не уверен, как ответить с помощью кода, поэтому в общих чертах описан процесс, описанный выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...