无法比较MongoDB中的日期

时间:2017-07-10 19:36:47

标签: c# mongodb linq

我对MongoDB很新,但我认为这是一个非常简单的查询。

我有一个继承自IProtein的蛋白质对象(是的,我的命名很糟糕)

public interface IProtein
{
    int Count { get; set; }
    DateTime Date { get; set; }
}

我想根据蛋白质对象的FirstOrDefault字段与Date

的日期比较,从集合中返回Today
    public IProtein GetProteinForDay(DateTime day)
    {
        var collection = _db.GetCollection<IProtein>(DB_COLLECTION);

        var query = collection.AsQueryable<IProtein>()
                              .Where(p => p.Date == day.Date);

        var protein = query.FirstOrDefault();
        return protein;
    }

不幸的是,我尝试使用MongoDB(有些使用Linq,有些没有使用)来尝试匹配日期的许多不同变体,我完全忘记了我对每个日期的距离。< / p>

这是我当前的代码,它返回错误Unable to determine the serialization information for the expression: p.Date

我的查询有什么问题(是的,它可能非常简单)我如何用MongoDB / Linq查询实际比较日期?

1 个答案:

答案 0 :(得分:3)

嗯,令人失望的是.net DateTime无法与MongoDB驱动程序无缝协作。我相信支持应该融入司机。

无论如何,您需要采取一些步骤才能使.net和MongoDB协同工作。

1)使用Date属性在接口中装饰BsonDateTimeOptions字段,告诉MongoDB驱动程序如何序列化.net DateTime。见BsonDateTimeOptions Documentation

界面应该看起来像

public interface IProtein
{
    int Count { get; set; }

    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    DateTime Date { get; set; }
}

2)在GetProteinForDay功能中,替换

var collection = _db.GetCollection<IProtein>(DB_COLLECTION);
var query = collection.AsQueryable<IProtein>()
                              .Where(p => p.Date == day.Date);

var collection = db.GetCollection<Protein>(DB_COLLECTION);
var query = collection.Find(p => p.Date == day); 

请注意,我已将接口IProtein替换为接口的具体实现,在我的情况下为Protein

更新:附上完整程序作为参考。

来源文件:

{
  _id: ObjectID('5964ebf315c46ab80b2c20f3),
  Count: 10,
  Date: '2017-07-11 00:00:00.000'
}

测试程序:

using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;

namespace mongoT
{
    public interface IProtein
    {
        ObjectId Id { get; set; }
        int Count { get; set; }

        [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
        DateTime Date { get; set; }
    }

    public class Protein : IProtein
    {
        public ObjectId Id { get; set; }
        public int Count { get; set; }
        public DateTime Date { get; set; }

        public override string ToString()
        {
            return $"{nameof(Id)}: {Id}, {nameof(Count)}: {Count}, {nameof(Date)}: {Date}";
        }
    }

    class Program
    {
        private static string DB = "ProteinsDB";
        private static string COLLECTION = "Proteins";

        static void Main(string[] args)
        {
            var result = GetProteinForDay(DateTime.Now.Date);
            Console.WriteLine(result);
        }

        public static IProtein GetProteinForDay(DateTime day)
        {
            var client = new MongoClient();
            var db = client.GetDatabase(DB);

            var collection = db.GetCollection<Protein>(COLLECTION);
            var query = collection.Find(p => p.Date == day.Date);

            var protein = query.FirstOrDefault();
            return protein;
        }
    }
}