2017-08-02 41 views
0

我無法理解如何在Mongo C#2.4驅動程序中執行findOne操作。Mongo C# - FindOne在哪裏?

我有一個超過910萬個平面文檔的集合。當我在Robomongo執行findOne時,查詢需要0秒,並返回我想要的結果。

在C#中,這需要大約7-8秒。

目前我實現一個找到像這樣:

var result = await _collection.Find(filterDefinition).SingleAsync(); 

這需要7-8秒。

蒙戈查詢 - 找到一個 - 0秒

.findOne({ipFrom: { $lte: 1436497981 }, ipTo: { $gte: 1436497981 }}); 

蒙戈查詢 - 查找 - 7.4秒

.find({ipFrom: { $lte: 1436497981 }, ipTo: { $gte: 1436497981 }}); 

我不能IMongoCollection<>找到一個FindOneFindOneAsync方法,所以我很懷疑.Find(...).SingleAsync()只是執行mongo find函數。我可以看到有FindOneAndUpdate,FindOneAndDeleteFindOneAndReplace,但沒有FindOne。我使用的查詢

我的過濾器定義如下:

var filter = Builders<TLocationEntity>.Filter; 

var filterDefinition = filter.And(
    filter.Lte("ipFrom", ipValue), 
    filter.Gte("ipTo", ipValue) 
); 

基本上,什麼是做在C#驅動程序findOne正確的方法是什麼?

+0

好吧,從技術上說,shell中的'.findOne()'和其他所有API都是如此。你可以通過在''db.collection.findOne''中輸入''''而不用括號'()'來在shell中看到它。這將告訴你'.find()'實際上是底層API中唯一的實際調用。如果你想要「蘋果與蘋果」,你需要'.find({ipFrom:{$ lte:1436497981},ipTo:{$ gte:1436497981}})。limit(1)'基本上比較相同的東西。 –

+0

@NeilLunn夠公平的,謝謝!自從我接觸Mongo後已經過了好幾年,所以我有點生疏了!在我的'.Find()'方法中加入'.Limit(1)'可以顯着提高性能。 – Tom

+0

而這基本上就是'.SingleAsync()'和類似的東西。所以從技術上講,所有東西都只是一個「光標修飾符」,用於查找。 API已經發生了一些變化,通常會使這些語言更加一致。 –

回答

0

添加Limit(1)固定對我來說:

await _collection.Find(filterDefinition).Limit(1).SingleAsync(); 

我本來期望.SingleAsync()執行Limit(1)裏面,但是它似乎執行.Limit(2)代替。這足以讓我的查詢從0秒變爲8秒。