Mongodb:如何基于id聚合来自不同集合的数据
我有一个文档,其中的数据类似于Mongodb:如何基于id聚合来自不同集合的数据,mongodb,Mongodb,我有一个文档,其中的数据类似于 收藏A { "_id" : 69.0, "values" : [ { "date_data" : "2016-12-16 10:00:00", "valueA" : 8, "valuB" : 9 }, { "date_data" : "2016-12-16 11:00:00", "valueA" : 8, "valuB" : 9
收藏A
{
"_id" : 69.0,
"values" : [
{
"date_data" : "2016-12-16 10:00:00",
"valueA" : 8,
"valuB" : 9
},
{
"date_data" : "2016-12-16 11:00:00",
"valueA" : 8,
"valuB" : 9
},.......
}
B组
{
"_id" : 69.0,
"values" : [
{
"date_data" : "2017-12-16 10:00:00",
"valueA" : 8,
"valuB" : 9
},
{
"date_data" : "2017-12-16 11:00:00",
"valueA" : 8,
"valuB" : 9
},.......
}
数据每小时存储一次,因为它存储在一个文档中,在某个点上可能会达到16Mb的限制,这就是为什么我考虑将数据跨年传播,这意味着在一个集合中,所有id都将每年保存数据。但当我们想要显示合并的数据时,我们如何使用聚合函数呢
例如,collectionA拥有2016年12月7日至2017年12月7日的数据,collectionB拥有2015年12月6日至2016年12月6日的数据。我如何显示2016年12月1日至2017年1月1日之间不同集合中的数据 非常简单,使用mongodb$lookup查询,它相当于左外部联接。左侧的所有文档都将在字段内扫描一个值,右侧的文档将认为外来文档在值方面匹配。对于您的情况,这里是父集合 父级A 子集合B 现在我们所要做的就是从集合a中进行查询 通过一个非常简单的聚合$lookup查询,您将看到以下结果 记住几件事
尝试将所有数据存储在单个集合中,并将数据分散到不同的文档中,然后创建一个键,以便根据需要的粒度将它们关联起来。对于每个文档,您可以添加一个包含元数据(如年、月等)的字段,因为您知道该文档中存储了哪些内容以供查询。@Veeram,谢谢您的建议,但如果我们存储在不同的文档中,问题仍然是一样的,如何使用聚合查询显示数据,如果数据分布在文档中?您可以查询字段的元数据以查找所需的数据。只需构建过滤器和查询。构建过滤器的工作量很小,但可以避免获取整个嵌入式阵列。例如,
2016年12月1日至2017年12月31日
您可以使用filter{$and:[{year:16,month:12},{year:17,{month:{$gt:0,$lte:12}}]}
@Veeram查询所有文档,这意味着如果我使用{id:69.0,我需要更改{u id使其成为timestamo,这样它就不会给出重复的密钥错误,然后使用,匹配:指标(id)和年份、元数据和过滤器使用“值”分组以获得结果,对吗?
db.getCollection('uniques').aggregate([
{
"$lookup": {
"from": "values",//Get data from values table
"localField": "_id", //The field _id of the current table uniques
"foreignField": "parent_id", //The foreign column containing a matching value
"as": "related" //An array containing all items under 69
}
},
{
"$unwind": "$related" //Unwind that array
},
{
"$project": {
"value_id": "$related._id",//project only what you need
"date": "$related.date_data",
"a": "$related.valueA",
"b": "$related.valueB"
}
}
], {"allowDiskUse": true})