Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从MongoDB中提取特定记录,其中记录使用C中的对象GUID#_C#_Mongodb_Mongodb Query - Fatal编程技术网

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

C# 从MongoDB中提取特定记录,其中记录使用C中的对象GUID#,c#,mongodb,mongodb-query,C#,Mongodb,Mongodb Query,我使用的一个Mongo对象(这里称为“Admin”)使用GUID作为主键,并有一个包含datevalue的“DailyActivities”列表和另一个名为“Subactivities”的列表。管理对象如下所示。我正在努力寻找C#中的资源,这些资源将有助于提取仅与特定日期对应的日常活动,其中的子活动具有“功耗”类别 { "_id" : ObjectId("5a2b7b887df7ce464404dc7d"), "DailyActivities" : [ {

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

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

现在,我没有时间完成这个练习,但这里有一些东西可以让你继续。我将在下周对其进行编辑和改进(例如,将其转换为一些c语言,其中许多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"
    }
}])

现在,我没有时间完成这个练习,但这里有一些东西可以让你继续。我将在下周对其进行编辑和改进(例如,将其转换为一些c语言,其中许多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"
    }
}])

让我为您提供一个使用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();

        }
    }
}

让我为您提供一个使用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();

        }
    }
}

您想要的输出文档是什么样子?@dnickless只需要如下子活动对象,而不需要父对象。所以,简单地说,{“entryDate”:ISODate(“2017-12-09T06:30:26.658Z”),“category”:“功耗”}您想要的输出文档是什么样子?@dnickless只需要如下子活动对象,而不需要父对象。所以,简单地说,{“entryDate”:ISODate(“2017-12-09T06:30:26.658Z”),“category”:“功耗”}上面的内容非常有用,我可以转换成C代码,非常感谢@dnickless上面的内容非常有用,我可以转换成C代码,非常感谢@dnickless