是否建议在MongoDB上使用嵌套文档处理大量数据时使用展开

时间:2018-05-22 14:57:02

标签: mongodb

我是MongoDB的新手,我正在使用MongoDB和C#开发应用程序。我正在处理大约2000万份文件。我在我的集​​合中嵌套了对象。我需要编写一些查询来根据我的集合中第二或第三级数据的某些条件获取一些数据。是使用unwind命令的好方法还是我应该使用mapreduce来解决我的问题?这种方法将来会给我带来麻烦吗? 我的数据结构如下所示

{
    "_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")
                }
            ]
        }
    ]
}

EndpointIdTags.Uid不是唯一的。我在此集合上写了一些不同的查询,例如查询以查找EndpointIdTags.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,还是最好使用mapreduce

0 个答案:

没有答案