Mongo过滤器中的'in'与linq版本的区别

4

在以下两种情况下哪种更有效率:

使用in过滤器:

var filter = Builders<Employee>.Filter.In(x => x._id, IdList);

或者,使用linq并传递以下表达式:

(x => IdList.Contains(x))

MongoDB的驱动程序能否以相同的方式进行分解?


1
这需要速度抱怨:https://ericlippert.com/2012/12/17/performance-rant/ 您可以跳过“第一部分”。 - Christopher
@Christopher,我们正在讨论一个小数据集,因此答案在绝对结果方面是无关紧要的。更多的是我想知道未来情况下事情是如何在内部运作的。也许答案是LINQ查询被分解成mongo过滤原语,或者大量数据通过Linq处理在一个非常大的列表中检索...我不知道,但我想知道 :) - Thomas
不是一个坏主意。这是我经常会提出的建议:如果必须进行过滤,应该始终在数据库请求中进行。仅为了在客户端进行过滤而检索太多数据只会导致问题。但就个人而言,我总是会在查询中显式地进行过滤,而不是希望 LINQ 被转换为适当的数据库命令。 - Christopher
1个回答

0

嗯,我猜这取决于您使用的端点以及筛选器或linq查询。例如:

collection.Find(Builders<Employee>.Filter.In(x => x.ID, IdList))
collection.Find(x => IdList.Contains(x.ID))

都翻译为:

db.Employees.find({
    "_id": {
        "$in": [
            ObjectId("5d462fbd548a6107ccb019b6"),
            ObjectId("5d462fbd548a6107ccb019b7")
        ]
    }
})

collection.AsQueryable().Where(x => IdList.Contains(x.ID))
collection.Aggregate().Match(x => IdList.Contains(x.ID))

都可以翻译成:

db.Employees.aggregate(
    [
        {
            "$match": {
                "_id": {
                    "$in": [
                        ObjectId("5d462fbd548a6107ccb019b6"),
                        ObjectId("5d462fbd548a6107ccb019b7")
                    ]
                }
            }
        }
    ]
)

所以我认为公平的比较应该是“查找”与“聚合”,而不是“过滤”与“LINQ”,如果查询性能是您关心的问题。

据我所知,查找和聚合之间的主要区别在于它们(可能)使用不同的查询计划和索引。不太确定... 您来评判...


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