我有两个具有以下数据格式的集合-
{
"_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
而不是值。
谢谢!
答案 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"
]
}