如何使用mongoDB批量检索文档?

时间:2011-01-11 18:48:47

标签: c# optimization mongodb

我有一个应用程序使用mongoDB C#驱动程序查询来自mongoDB的数据,如下所示:

public void main()  
{
   foreach (int i in listOfKey)
   {
      list.add(getObjectfromDB(i);
   } 
}

public myObject getObjFromDb(int primaryKey)
{
   document query = new document();
   query["primKey"] = primaryKey;
   document result= mongo["myDatabase"]["myCollection"].findOne(query);
   return parseObject(result);
}

在我的本地(开发)机器上以这种方式获得100个对象只需不到一秒钟。但是,我最近将数据库移动到Internet上的服务器,并且此查询大约需要30秒才能执行相同数量的对象。

此外,查看mongoDB日志,似乎打开了大约8-10个与DB的连接来执行此查询。

所以我想要做的是查询数据库中的primaryKeys数组并立即将它们全部取回,然后在循环中进行解析,如果可能的话,使用一个连接。

我怎样才能优化我的查询呢? 谢谢,
- 迈克尔

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找的是你查询中神奇的“$ in”语句。我不熟悉C#,但在json中,你会看到一个类似于:

的查询
query = {
   'primaryKey': {
      '$in': [
         'val1',
         'val2',
         'val3'
      ]
   }
}

上面会在调用.find()时返回一个结果列表作为游标,这与你现在正在提交单个primaryKey并调用findOne()的内容相反。

find()返回一个游标(与findOne()相反,它返回一个数据结构)所以访问你必须循环遍历游标对象的数据以获取每个文档。

希望这有帮助!请随意在评论中提出更具体的问题。

MongoDB $或参考:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

C#find()参考:http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

答案 1 :(得分:2)

你想使用$ in。 $或者也可以使用,但更详细,只支持更新的版本(我认为是1.5.4后)。