Node.js 聚合链接文档的组数据
目前,我们使用以下代码按创建日期对集合中的所有文档进行分组:Node.js 聚合链接文档的组数据,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,目前,我们使用以下代码按创建日期对集合中的所有文档进行分组: this.aggregate( [ { $match: { language: options.criteria.language, status: 1, type:{ $ne: "challenge" } }}, { $group: { _id: { y: { '$year': '$created' }, m: { '$month
this.aggregate( [
{ $match: { language: options.criteria.language, status: 1, type:{ $ne: "challenge" } }},
{ $group: {
_id: {
y: { '$year': '$created' },
m: { '$month': '$created' },
d: { '$dayOfMonth': '$created' },
h: { '$hour': '$created' },
min: { '$minute': '$created' },
s: { '$second': '$created' }
},
count: { $sum : 1 }
}},
{$project: {
date: "$_id", // so this is the shorter way
count: 1,
_id: 0
}},
{ $sort: { "date": 1 } }
], function(err, result){
if(err) {
return callback(err);
}
callback(null, result);
});
但是,我们现在希望根据开始日期而不是创建日期对结果进行分组。开始日期不是当前集合的字段,而是链接到此集合中的currentRevision
对象的字段
我试过这个:
this.aggregate( [
{ $match: { language: options.criteria.language, status: 1, type:{ $ne: "challenge" } }},
{ $group: {
_id: {
y: { '$year': '$currentRevision.start_date' },
m: { '$month': '$currentRevision.start_date' },
d: { '$dayOfMonth': '$currentRevision.start_date' },
h: { '$hour': '$currentRevision.start_date' },
min: { '$minute': '$currentRevision.start_date' },
s: { '$second': '$currentRevision.start_date' }
},
count: { $sum : 1 }
}},
{$project: {
date: "$_id", // so this is the shorter way
count: 1,
_id: 0
}},
{ $sort: { "date": 1 } }
], function(err, result){
if(err) {
return callback(err);
}
callback(null, result);
});
但这只是给了我一个错误:“无法查询数据库”
你知道如何解决这个问题吗?你说的“链接文档”是什么意思。mongoose模型中是否引用了另一个集合中的实际数据?你不能那样做。MongoDB一次只能对一个集合进行操作。Mongoose
.populate()
不是连接,只是连接的幻觉。所有数据都需要在同一个集合中才能聚合。或者您正在客户端中进行处理。是的,它确实在引用的另一个集合中。很遗憾,这是不可能的:(这实际上是使用MongoDB的一个基本概念。没有连接。如果您打算将数据与其他数据一起用作查询或收集点,那么您的设计需要将其放在同一个集合中,而不是引用它。您不能只做与使用关系数据库相同的事情。重点是基于ho设计和存储shemaw您打算使用它,而不仅仅是您习惯使用的。可能通过两个查询就可以做到这一点吗?不。您基本上仍然在要求“连接”,因为“startDate”是另一个集合中文档的属性。您的结构表明这是1:1
,因此具有“链接”数据没有任何意义。它只是一个关系概念,在MongoDB设计中没有你所依赖的位置。你可能在很多地方引用同一个对象,所以关系思维说“使用另一个表”。但MongoDB不是这样工作的。请将所需的数据存储在文档中,并挂起重复。收益可能大于成本。