Javascript 限制聚合调用中字段属性的更好方法
因此,我试图在MongoDB中执行一个Javascript 限制聚合调用中字段属性的更好方法,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,因此,我试图在MongoDB中执行一个aggregate调用来查找一个集合,但同时限制从另一个集合中获取的数据量。以下是我对这类作品的尝试: getFamilyStats: function (req, res) { Families .aggregate([ { $match: { 'centralPath': req.body.centralPath }}, { $lookup: { fr
aggregate
调用来查找一个集合,但同时限制从另一个集合中获取的数据量。以下是我对这类作品的尝试:
getFamilyStats: function (req, res) {
Families
.aggregate([
{ $match: { 'centralPath': req.body.centralPath }},
{ $lookup: {
from: 'models',
localField: 'centralPath',
foreignField: 'centralPath',
as: 'models'
}},
{ $unwind: '$models'},
{ $project: {
'models.openTimes.user': 1,
'_id': 1,
'centralPath': 1,
'totalFamilies': 1,
'unusedFamilies': 1,
'oversizedFamilies': 1,
'inPlaceFamilies': 1,
'families': 1
}}
]
).exec(function (err, response){
var result = {
status: 200,
message: response
};
if (err){
result.status = 500;
result.message = err;
} else if (!response){
result.status = 404;
result.message = err;
}
res.status(result.status).json(result.message);
});
},
因此,我可以使用lookup
来“连接”来自不同集合的数据,在本例中称为模型,这是一个非常有效的事实。一旦我展开
它,它看起来就像我想要它一样,除了我只对该属性中的一个字段感兴趣:models.openTimes
,在这种特殊情况下,实际上只有该字段的一个属性user
。我试图使用project
来限制我从模型中传递的大部分数据,但这迫使我解释所有其他字段,如:
_id: 1,
centralPath: 1....
如果我的收藏以新的属性扩展,那就不太理想了。我正在寻找一种方法,将模型
中的数据限制为一个字段/一个属性,但从系列
集合中获取所有字段
想法
族的示例数据:
{
"_id" : ObjectId("5ae08c75d132ac4442520672"),
"centralPath" : "some path",
"totalFamilies" : 0,
"unusedFamilies" : 0,
"oversizedFamilies" : 0,
"inPlaceFamilies" : 0,
"families" : [],
"__v" : 0
}
模型的示例数据:
{
"_id" : ObjectId("5ae08c74d132ac4442520638"),
"centralPath" : "some path",
"openTimes" : [
{
"value" : 8123,
"user" : "ks",
"createdOn" : ISODate("2018-04-25T14:11:00.853Z"),
"_id" : ObjectId("5ae08c74d132ac444252063a")
}
],
"synchTimes" : [
{
"value" : 208649,
"user" : "ks",
"createdOn" : ISODate("2018-04-25T16:42:42.933Z"),
"_id" : ObjectId("5ae0b0028c2e3b192a3e9dc5")
}
],
"modelSizes" : [
{
"value" : 21483520,
"user" : "ks",
"createdOn" : ISODate("2018-04-25T14:11:00.787Z"),
"_id" : ObjectId("5ae08c74d132ac4442520639")
}
],
"__v" : 0
}
您可以在3.4及更高版本中尝试以下聚合
$addFields
从合并的集合中返回唯一的字段,同时保留现有字段;以及$project
排除以删除合并的集合数据
将项目阶段替换为addFields和project阶段
Families.aggregate([
existing stages,
{"$addFields":{
"user":"$models.openTimes.user"
}},
{"$project":{"models":0}}
])
从MongoDB v3.6开始,您可以直接限制
db.families.aggregate([
{ $match: { 'centralPath': 'some path' } },
{ $lookup: {
from: 'models',
let: { centralPath: '$centralPath' }, // remember the value of the "centralPath" field
pipeline: [
{ $match: { $expr: { $eq: [ '$centralPath', '$$centralPath' ] } } }, // this performs the "join"
{ $project: { _id: 0, 'openTimes.user': 1 } } // only retrieve the "openTimes.user" field
],
as: 'models'
}},
{ $unwind: '$models'},
]);
良好的描述和更好的和简短的选择,以实现目标+你的逻辑:)嗨,维拉姆,你能回答这个问题吗