MEAN stack - заменить идентификаторы массива полей документа соответствующими именами из другой коллекции - PullRequest
0 голосов
/ 29 июня 2018

У меня есть две коллекции со следующим форматом данных -

{  
   "_id":ObjectId("5b336305fa012c47c837d3b9"),
   "title":"Information",
   "description":"<p><strong>Hello World! This is a test editor</strong></p>",
   "status":"publish",
   "categories":[  
      "5b2b02cd317c7e100d3ae773"
   ],
   "created_date":   ISODate("2018-06-27T10:12:21.294   Z"),
   "image":"/articles/server/images/1530094341293.jpg",
   "owner_id":"5b1510af1d1b700edc110dda"
}


{  
   "_id":ObjectId("5b2b02cd317c7e100d3ae773"),
   "name":"Google",
   "slug":"google_1529545421927",
   "description":"google another test....",
   "created_date":   ISODate("2018-06-21T01:43:41.918   Z")
}

Первый - Articles, а второй - Categories коллекция.

Я пытался заменить следующие Articles идентификаторы полей коллекции соответствующими именами категорий из Categories коллекции, когда мой экспресс-запрос вернулся с json data -

"categories":[  
          "5b2b02cd317c7e100d3ae773"
       ],

Так что я мог бы отправить имя категории, а не идентификатор в следующем формате -

"categories":[  
              "Google"
           ],

Я пытался выполнить запрос forEach из MongoDB со следующим кодом -

db.collection('articles').find()
            .forEach(function (article) {
                let categories = article.categories;

                categories = categories.map(id => ObjectID(id));

                var doc2 = db.collection('categories').find({_id: {$in: categories}});

                console.log(doc2);

                res.status(200).json('success');

            });

Я ценю ваши подсказки или решения, чтобы получить эффективное решение без написания большого количества запросов.

Примечание:

Я пытался с aggregate $lookup, но я не смог этого сделать, так как мне пришлось иметь дело с array, а не со значением.

Спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете использовать $lookup - с этими массивами не так уж сложно справиться.

db.collection('articles').aggregate([
    // {_id: '...', categories: ['...', '...', ...]}
    {$project: {categories: 1}},

    // {_id: '...', categories: '...'}
    {$unwind: '$categories'},

    // {_id: '...', categories: [{_id: '...', name: '...', ...}, ...]}
    {$lookup: {
        from: 'categories',
        localField: 'categories',
        foreignField: '_id',
        as: 'categories'
    }},

    // {_id: '...', categories: {_id: '...', name: '...', ...}}
    {$unwind: '$categories'},

    // {_id: '...', categories: ['...', ...]}
    {$group: {
        _id: '$_id', 
        categories: {$addToSet: '$categories.name'}
    }}
])

Результат:

{
    "_id" : ObjectId("5b336305fa012c47c837d3b9"),
    "categories" : [ 
        "Google"
    ]
}
...