我可以找到2个MongoDB文档之间的差异吗?

时间:2013-12-10 19:32:36

标签: c# .net mongodb mongodb-query mongodb-.net-driver

假设我有以下文档结构:

{
    "_id" : id,
    "name" : "Tom Cruise",
    "movies" : [
        {
                "movie_id" : id,
                "name" : "Mission Impossible",
                "yr_released": 1996
        },
        {
                "movie_id" : id,
                "name" : "Minority Report",
                "yr_released": 2002
        }
    ]
}

以下是我的POCO:

public class Actor
{
    [BsonId]
    public int Id { get; set; }
    [BsonElement("name")]
    public string Name { get; set; }
    [BsonElement("movies")]
    public List<Movies> Movies { get; set; }
}

public class Movies
{
    [BsonId]
    public int Id { get; set; }
    [BsonElement("name")]
    public string Name { get; set; }
    [BsonElement("yr_released")]
    public int YearReleased
}

让我们说第二天,文档得到更新,但最后一个电影名称从“少数派报告”改为“香草天空”。我想找出子文档中发生了哪些变化。这是我使用的示例代码(不起作用):

var yesterdayQuery = (yesterdayColl.AsQueryable<Actor>()
    .Where (b => b.Name.Contains("Cruise"))).ToList();
var todayQuery = (todayColl.AsQueryable<Actor>()
    .Where (b => b.Name.Contains("Cruise"))).ToList();
var diff = todayQuery.Except(yesterdayQuery);

由于Mongodb的C#驱动程序没有Except()支持,我认为如果我使用Linq to Objects作为解决方法,我将能够找到差异。我想我错了。基本上,我想在文件之间找到以下区别:

  • 如果属性值已更改
  • 如果文档或子文档已被删除
  • 如果已添加子文档

我的问题是:如何使用C#驱动程序(希望如此)编写强类型查询来实现此目的?

2 个答案:

答案 0 :(得分:0)

我不熟悉MongoDB,但我认为你会像这样编写你的类:

public class Actor
{
    // equal objects must have equal hash codes
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }

    // objects with the same Id are equal
    public override bool Equals(object obj)
    {
        Actor other = obj as Actor;
        if (other == null)
            return false;
        return this.Id == other.Id;
    }

    [BsonId]
    public int Id { get; set; }
    [BsonElement("name")]
    public string Name { get; set; }
    [BsonElement("movies")]
    public List<Movies> Movies { get; set; }
}

答案 1 :(得分:0)

如果您想知道更改而不仅仅如果它已被更改,那么它不是真正的MogngoDB问题。 您需要2份数据。然后你需要按属性去属性(如果你希望它更通用,可以使用反射)并获得新值。 旧副本可以保存在DB中,新副本只能保存在内存中。