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

时间:2014-08-01 15:11:19

标签: c# mongodb

我有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)

请告诉我。

1 个答案:

答案 0 :(得分:0)

  

db.Products.distinct(" PRODNAME",{_ ID:{" $在":db.Order.distinct("的ProdID" {&# 34; 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 "joins")。