簡體   English   中英

在mono中使用c#驅動比較mongo集合的兩個字段

[英]Comparing two fields of mongo collection using c# driver in mono

對 Mongodb 和 C# 驅動程序完全陌生。

在 Ubuntu 14.04 上使用 Monodevelop 進行開發,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 時間戳的用戶? 進行了一些搜索,但一直無法找到答案。

任何建議都會有很大幫助

謝謝

實際上,這不是很簡單。 這應該可以通過查詢實現,例如:

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 - 屬性,我沒有首先提到它,因為我認為您確實有一個,只是沒有發布在問題中。

還有另一種方法可以做到。 首先讓我們聲明集合:

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 或更高版本。 如有任何混淆,請發表評論。 希望我能夠解釋這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM