从MongoDB中提取特定记录,其中记录使用C#中的Object GUID

时间:2019-02-22 00:48:53

标签: c# mongodb mongodb-query

我使用的一个Mongo对象(在此称为“管理员”)使用GUID作为主键,并具有包含日期​​值的“ DailyActivities”列表和另一个名为“ Subactivities”的列表。 Admin对象如下所示。我正在努力寻找C#中的资源,这些资源将有助于提取DailyActivities,该DailyActivities仅与子活动具有“功耗”类别的特定日期相对应。

{
    "_id" : ObjectId("5a2b7b887df7ce464404dc7d"),
    "DailyActivities" : [ 
        {
            "datetime" : ISODate("2017-12-09T16:29:00.916Z"),
            "Subactivities" : [ 
                {
                    "entryDate" : ISODate("2017-12-09T06:30:26.658Z"),
                    "category" : "Power Consumption"
                }, 
                {
                    "entryDate" : ISODate("2017-12-09T06:30:26.658Z"),
                    "category" : "Machinery"
                }
            ]
        }, 
        {
            "datetime" : ISODate("2017-12-13T00:00:00.916Z"),
            "Subactivities" : [ 
                {
                    "entryDate" : ISODate("2017-12-13T06:30:26.658Z"),
                    "category" : "Lamination"
                }
            ]
        }
    ]
}

我希望收到的结果应该是:

{
    "_id" : ObjectId("5c7044f07ef75175b2b8efd6"),
    "entryDate" : ISODate("2017-12-09T06:30:26.658Z"),
    "category" : "Power Consumption"
}

2 个答案:

答案 0 :(得分:0)

现在,我没有时间完成这项练习,但是这里有些事情可以帮助您前进。我将在下周对此进行编辑和改进(如将其转换为c#,使用类型化方法将无法将其转换成很多……)。

db.collection.aggregate([{
    $project: {
        "DailyActivities": {
            $filter: {
                input: "$DailyActivities",
                cond: {
                    $eq: [ "$$this.datetime", ISODate("2017-12-09T16:29:00.916Z") ]
                }
            }
        }
    }
}, {
    $unwind: "$DailyActivities"
}, {
    $unwind: "$DailyActivities.Subactivities"
}, {
    $replaceRoot: {
        "newRoot": "$DailyActivities.Subactivities"
    }
}, {
    $match: {
        "category": "Power Consumption"
    }
}])

答案 1 :(得分:0)

让我为您提供使用MongoDAL作为数据访问层的解决方案。它是c#驱动程序的包装,因此您可以获得该驱动程序的所有功能以及一个高度类型化的api。

using System;
using System.Linq;
using MongoDAL;

namespace AdminActs
{
    class Admin : Entity
    {
        public DailyActivity[] DailyActivities { get; set; }
    }

    class DailyActivity
    {
        public DateTime Time { get; set; }
        public SubActivity[] SubActivities { get; set; }
    }

    class SubActivity
    {
        public DateTime EntryDate { get; set; }
        public string Category { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new DB("activities");

            var now = DateTime.Now;

            var admin = new Admin
            {
                DailyActivities = new DailyActivity[]
                {
                    new DailyActivity{
                        Time = now,
                        SubActivities = new SubActivity[]
                        {
                            new SubActivity{
                                Category ="Power Consumption",
                                EntryDate = DateTime.Now}
                        }
                    }
                }
            };

            admin.Save();

            var subActivities = admin.Collection()
                                     .SelectMany(a => a.DailyActivities)
                                     .Where(da => da.Time == now)
                                     .SelectMany(da => da.SubActivities)
                                     .Where(sa => sa.Category == "Power Consumption");

            var res = subActivities.ToArray();

            Console.ReadKey();

        }
    }
}