MongoDB C#/VB.Net驱动程序发送多个嵌套查询

MongoDB C#/VB.Net驱动程序发送多个嵌套查询,c#,mongodb,C#,Mongodb,我有2-3个系列,从MongoDB shell我可以有一个 查询如下: db.Products.distinct("ProdName",{_id:{"$in":db.Order.distinct("ProdID",{"OrderID" : 555})}}) 这很好,我没有使用嵌入式方法,因为我的集合大小是以百万计的,所以这是不可行的 我的问题与C#有关,我们是否可以在一次调用中传递上述mongoQuery,或者指示mongodb在被告知之前不要提取?目前,似乎有2个数据库调用发生在C#上,但从

我有2-3个系列,从MongoDB shell我可以有一个 查询如下:

db.Products.distinct("ProdName",{_id:{"$in":db.Order.distinct("ProdID",{"OrderID" : 555})}})
这很好,我没有使用嵌入式方法,因为我的集合大小是以百万计的,所以这是不可行的

我的问题与C#有关,我们是否可以在一次调用中传递上述mongoQuery,或者指示mongodb在被告知之前不要提取?目前,似乎有2个数据库调用发生在C#上,但从MongoDB上,它下面唯一的调用就是获取结果的C#代码

Dim mongoQuery1 = Query.EQ("OrderID", iOrderID)

Dim collection1 = db.GetCollection(Of BsonDocument)("Order").Distinct("ProdID", mongoQuery1)

Dim ProdIDs = collection1.ToArray()

Dim newBsonArray1 = New BsonArray(ProdIDs)
Dim mongoQuery2 = Query.In("_id", newBsonArray1)

Dim collection2 = db.GetCollection(Of BsonDocument)("Products").Distinct("ProdName", mongoQuery2)
请让我知道

db.Products.distinct(“ProdName”,{u id:{“$in”:db.Order.distinct(“ProdID”,{“OrderID”:555}}})

在这个
mongo
shell示例中,您实际上是在MongoDB服务器上执行两个查询,尽管出现了一个带有函数调用的查询。在将查询发送到服务器之前,
mongo
shell将解析所有变量(包括对
db.Order.distinct()
)的调用)

如果您不确定,可以使用MongoDB数据库探查器检查这一点:

// Enable profiling for all queries
db.setProfilingLevel(2)

// Run the "single" query
db.Products.distinct("ProdName",{_id:{"$in":db.Order.distinct("ProdID",{"OrderID" : 555})}})

// Disable profiling
db.setProfilingLevel(0)

// Query for the profile entries distinct command
db.system.profile.find({ "op":"command", "command.distinct": { $exists: true }})

等效的C#代码还将涉及两个查询,因为您要查询两个不同的集合。MongoDB(2.6版)明确不支持涉及多个集合的单个查询(aka)。

嗨,Stennie,我同意你的观点,但我的问题在c中,我不需要在客户端查询和存储数据,并将其作为输入重新发送到下一个查询,从而提高内存和网络利用率,那么,是否可以将查询作为C#中的shell查询一次性发送到MongoDB,并且如果MongoDB在内部执行就可以了seperately@Ajay:我想你可能对
mongo
shell正在做什么感到困惑;无论您是以“一条语句”还是两条语句的形式发送,它始终将作为两个查询执行,因此资源使用情况是相同的。在
mongo
shell中,在执行第二次查询之前,第一次查询和获取仍在进行,往返于
mongo
shell(本例中称为“客户机”)。shell查询不是“一次性”的,它是两个顺序执行的查询。通过C#调用
mongo
shell将增加复杂性,而不是保存它。嗨,Stennie,我同意在MongoDB端将有2次执行,但无论如何,是否只将shell脚本发送到MongoDB,让执行在MongoDB端进行(无论它在多个调用中分开)。这里的问题是,在我的示例中,假设订单将从mongodb检索数百万个ProDid,并且必须在客户端临时保存,这里的缺点是第一个巨大的网络带宽使用和第二个在客户端保存的临时内存。因此,如果我能够发送脚本或文本命令,那么在这种情况下,我将受益匪浅,所以我只想知道是否可以发送query@Ajay:否,您请求的“单一查询”是不可能的。如果您尝试从
mongo
shell执行相同的查询,那么在运行
distinct()
查询之前,它还会将所有结果拉回到shell客户端。如果您要从
订单
中检索数百万个prodid以加入
产品
,这听起来像是一个痛苦的大查询。我建议您研究一种更有效的方法,因为您正在合并来自多个集合的数据,所以我建议您研究。此模式将允许您逐步更新集合中的结果(例如,基于订单日期),这样您就不会每次从一开始就重新运行整个聚合。几年前有一篇博客文章,其中有一个相关的例子:。