MEAN堆栈-将文档字段数组ID替换为另一个集合中的相应名称

时间:2018-06-29 09:20:54

标签: mongodb express mean-stack

我有两个具有以下数据格式的集合-

{  
   "_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集合字段ID之后的

"categories":[  
          "5b2b02cd317c7e100d3ae773"
       ],

所以我将能够以以下格式发送类别名称而不是ID-

"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 :(得分:0)

您可以使用$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"
    ]
}