Javascript 如何使用聚合也包括非';不是从那个方法返回的吗?
目前,我有此功能,可检索所有Javascript 如何使用聚合也包括非';不是从那个方法返回的吗?,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,目前,我有此功能,可检索所有页面文档中使用的所有标记文档,统计出现的次数,并将其附加到返回的每个标记文档: exports.getAll = (req, res, next) => { const config = utils.prepareOptions(req.query); async.waterfall([ (done) => { Tag.count({}).exec((err, total) => { return d
页面
文档中使用的所有标记
文档,统计出现的次数
,并将其附加到返回的每个标记
文档:
exports.getAll = (req, res, next) => {
const config = utils.prepareOptions(req.query);
async.waterfall([
(done) => {
Tag.count({}).exec((err, total) => {
return done(err, total);
});
}
], (err, total) => {
Page.aggregate([
// {
// $unwind: "$tags"
// },
{
$group: {
_id: "$tags",
occurrences: {
$sum: 1
}
}
},
{
$lookup: {
from: "tags",
localField: "_id", // this is supposely wrong but I can't prove it
foreignField: "_id",
as: "tagsData"
}
},
{
$unwind: "$tagsData"
},
{
$match: {
"tagsData.label": new RegExp(config.query, 'i')
}
},
{
$project: {
occurrences: "$occurrences",
tagData: '$tagsData'
}
},
{
$addFields: {
"tagData._id": "$_id",
"tagData.occurrences": "$occurrences"
}
},
{
$replaceRoot: {
newRoot: "$tagData"
}
},
{$sort: {[config.sortBy]: config.order}},
{$limit: config.limit},
{$skip: config.offset}
], (err, tags) => {
console.log(tags);
console.log(err);
console.log(total);
if (err) {
return next(err);
}
res.json({
error: null,
data: tags,
total: total,
results: tags.length
});
});
});
};
这样做的问题是,标记
在任何给定时间都不必与页面
一起使用。这会导致调用此函数时出现问题,因为不会返回未使用的标记
因此,我需要做的是还包括每个未使用的标记
,并在其上设置一个引用:0
因此,如果我有3个标签
文档:
[
{_id: 1203f8sad9sf, label: 'Tag 1'},
{_id: 1203asdf89sf, label: 'Tag 2'},
{_id: 1203asqw89sf, label: 'Tag 3'}
]
和页面
文档:
{
_id: 90182312,
tags: [ObjectId(1203f8sad9sf), Object(1203asdf89sf)]
}
和标记1
和标记2
是页面
的标记
数组的一部分,如果我正确理解您的意图,并且假设您已经准备好了一些代码,以确保页面的标记
字段中没有重复的标记ID,那么如何将标记3
返回到从聚合
方法返回的标记
中以更有效、更简洁的方式重写:
db.getCollection('tags').aggregate([{
$lookup: {
from: "page",
localField: "_id",
foreignField: "tags",
as: "pageData"
}
}, {
$addFields: {
"occurrences": {
$size: "$pageData"
}
}
}])
那太令人沮丧了。。自从我发布这个问题以来,我一直在做各种各样的事情。我所要做的就是笑,我生命中的10个小时我再也回不来了。你这个男人。