在Mono中使用C#驱动程序比较Mongo集合的两个字段

5

我完全不了解Mongodb和C#驱动程序。

使用Monodevelop在Ubuntu 14.04上进行开发,Mongodb的版本是3.2.10:

目前我的代码有以下POCO:

public class User
{
    public String Name { get; set;}
    public DateTime LastModifiedAt { get; set;}
    public DateTime LastSyncedAt { get; set;}

     public User ()
    {

    }
}

已经能够创建一个集合并添加用户。

如何查找LastModifiedAt时间戳大于LastSyncedAt时间戳的用户?我已经搜索过了,但还没有找到答案。

任何建议都将非常有帮助。

谢谢

2个回答

2
实际上,这并不是很简单。这应该可以通过查询实现,例如:
var users = collection.Find(user => user.LastModifiedAt > user.LastSyncedAt).ToList();

但不幸的是,MongoDriver无法翻译这个表达式。你可以查询所有用户并在客户端过滤:

var users = collection.Find(Builders<User>.Filter.Empty)
                      .ToEnumerable()
                      .Where(user => user.LastModifiedAt > user.LastSyncedAt)
                      .ToList();

或者发送JSON查询,因为MongoDb本身就能够处理它:

var jsonFliter = "{\"$where\" : \"this.LastModifiedAt>this.LastSyncedAt\"}";
var users = collection.Find(new JsonFilterDefinition<User>(jsonFliter))
                      .ToList();

是的,你需要为你的模型类添加一个Id属性,我没有首先提到它,因为我认为你已经有了一个,只是没有在问题中发布。


这种方法可行,但必须向我的POCO添加Id字段。使用[BsonId]属性完成了这个操作。 - Sagar
这完全是错误的方法。你需要将该比较添加到你的过滤器中,并在数据库上进行操作,而不是在客户端上进行操作。 - Robert Smith

0

还有另一种方法可以实现。首先,让我们声明一个集合:

var collection = Database.GetCollection<BsonDocument>("CollectionName");

现在让我们添加我们的项目:

var pro = new BsonDocument {
                {"gt1", new BsonDocument {
                    { "$gt", new BsonArray(){ "$LastModifiedAt", "$LastSyncedAt" }
                    }
                } },
                {"Name", true },
                {"LastModifiedAt", true },
                {"LastSyncedAt", true }
                };

现在让我们添加过滤器:

var filter = Builders<BsonDocument>.Filter.Eq("gt1", true);

我们将聚合查询:

var aggregate = collection.Aggregate(new AggregateOptions { AllowDiskUse = true })
                .Project(pro)
                .Match(filter)

现在我们的查询已经准备好了。我们可以按照以下方式检查我们的查询:

var query=aggregate.ToString();

让我们按照以下方式运行查询:
var query=aggregate.ToList();

这将返回bson文档列表中所需的数据。

此解决方案适用于mongo c#驱动程序3.6或更高版本。如有任何疑问,请在评论中说明。希望我能够解释清楚。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接