我是MongoDB的新手,我正在使用MongoDB和C#开发应用程序。我正在处理大约2000万份文件。我在我的集合中嵌套了对象。我需要编写一些查询来根据我的集合中第二或第三级数据的某些条件获取一些数据。是使用unwind
命令的好方法还是我应该使用map
和reduce
来解决我的问题?这种方法将来会给我带来麻烦吗?
我的数据结构如下所示
{
"_id" : ObjectId("5aef51e0af42ea1b70d0c4dc"),
"EndpointId" : "89799bcc-e86f-4c8a-b340-8b5ed53caf83",
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Tags" : [
{
"Uid" : "E2:02:00:18:DA:40",
"Type" : 1.0,
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Sensors" : [
{
"Type" : 1.0,
"Value" : NumberDecimal("-98")
},
{
"Type" : 2.0,
"Value" : NumberDecimal("-65")
},
{
"Type" : 3.0,
"Value" : NumberDecimal("7.845424441900629")
}
]
},
{
"Uid" : "12:3B:6A:1A:B7:F9",
"Type" : 1.0,
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Sensors" : [
{
"Type" : 1.0,
"Value" : NumberDecimal("-95")
},
{
"Type" : 2.0,
"Value" : NumberDecimal("-59")
}
]
}
]
}
EndpointId
和Tags.Uid
不是唯一的。我在此集合上写了一些不同的查询,例如查询以查找EndpointId
和Tags.Uid
的唯一组合列表。
我的查询如下
db.EndpointData.aggregate([
{ "$unwind" : "$Tags" },
{ "$group" : { "_id" : { "EndpointId" : "$EndpointId", "Uid" : "$Tags.Uid" },
"EndpointId" : { "$first" : "$EndpointId" },
"Url" : { "$first" : "$Url" },
"TagId" : { "$first" : "$Tags.Uid" },
"Type" : { "$first" : "$Tags.Type" },
"LastDate" : { "$max" : "$Tags.DateTime" },
"FirstDate" : { "$min" : "$Tags.DateTime" } } }
])
我有更多这样的问题。那么建议使用unwind
,还是最好使用map
和reduce
?