MongoDB - вложение двух коллекций в одну - PullRequest
1 голос
/ 08 марта 2020

У меня есть 2 коллекции, и я хотел бы изменить дизайн базы данных и поместить все в одну коллекцию. Коллекция 1: автомобилей и Коллекция 2: отзывов . Я хочу поместить все данные из обзоров в коллекцию автомобилей. У них есть соответствие id_product , поэтому у каждой машины есть id_product , а в каждом обзоре также есть id_product .

Вот что я придумал:

var Acursor = db.getCollection('reviews').find({}, {_id:0});
              while (Acursor.hasNext()) {
              var nextDoc = Acursor.next();
              var textReview = nextDoc.reviewerID;
              var id_product = nextDoc.id_product;
              db.getCollection('cars').update({id_product:id_product},
              {$set: { textReview:textReview,}},
              {multi:true});
     };

Я запускаю код без каких-либо ошибок и сначала подумал, что он работает, но проблема в том, что если было 2 отзыва для одного автомобиля, только один отзыв был перенесен в другую коллекцию. Любая идея, как передать все отзывы, которые в паре с id_product?

1 Ответ

1 голос
/ 08 марта 2020

Это из-за {$set: { textReview:textReview}}, здесь вы каждый раз обновляете поле, так что если есть два отзыва для автомобиля, то первый будет записан в поле textReview и когда придет время для повторного просмотра он перезапишет существующее значение.

Вместо этого вы можете сделать {$push: { textReview:textReview}}, поэтому в первый раз он создаст массив textReview , после чего ваш запрос добавит новые элементы к существующим. массив.

Ссылка: $ pu sh

Но если ваша версия MongoDB>> = 4.2, я бы порекомендовал написать агрегирование отзывов коллекции с использованием $ lookup для объединения двух коллекций и последующего использования $ merge для записи результатов в коллекцию автомобилей вместо чтения & операция записи через код.

...