2016-07-04 31 views
0

我對MongoDB和MongoDB C#驅動程序很新。MongoDB強類型過濾器和Find()

爲了使代碼更具可讀性(和可靠性),我決定嘗試使用強類型對象。因此,我創建了一個POCO ...

只有Id和Payload最初出現在數據庫中。

internal class MongoDbRepositoryItem 
{ 
    [BsonId] 
    public string Id { get; set; } 

    [BsonElement("rawdata")] 
    public byte[] Payload { get; set; } 
    public string ProcessingStatus { get; set; } 
    public DateTime ProcessingStarted { get; set; } 
    public int ProcessingAttempts { get; set; } 
} 

現在有多個操作我需要完成。
首先,我需要檢索最古老的未經處理的物品。

我在想這樣的事情:

var builder = Builders<MongoDbRepositoryItem>.Filter; 

// I didn't read about sorting yet. I also need the "oldest" document. 
var filter = builder.Exists(item => item.ProcessingStatus, false); 

MongoDbRepositoryItem result = await _collection.FindAsync<MongoDbRepositoryItem>(filter); 

但是,這並不編譯。FindAsync()需要一個BsonDocument。我的過濾器顯然是強類型的。我在documentation找不到任何答案。

回答

1

第一件事情第一:-)

var result = await collection.FindAsync<MongoDbRepositoryItem>(filter); 
var data = result.ToList(); 

在這條線,我們期待一個cursor,而不是一個單一的項目。 使用data我們正在將光標聚焦到列表中供以後處理;

如果我們要得到的只是第一個項目,然後我們可以使用

MongoDbRepositoryItem result = collection.Find<MongoDbRepositoryItem>(filter).First(); 

編輯

var b2 = new FilterDefinitionBuilder<MongoDbRepositoryItem>(); 
var f2 = b2 . Exists(x => x.ProcessingStatus, false); 
var result2 = await collection.FindAsync<MongoDbRepositoryItem>(f2); 

任何意見歡迎!

+0

錯誤是「無法從FilterDefinition 轉換爲FilterDefinition 」。感謝First()提示,稍後我將使用FindOneAndUpdate()。 – lapsus

+0

你使用什麼版本的驅動程序 - 我無法重現.... – profesor79

+0

mongodriver = latest(2.2.4) – lapsus