我有一个应用程序使用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数组并立即将它们全部取回,然后在循环中进行解析,如果可能的话,使用一个连接。
我怎样才能优化我的查询呢?
谢谢,
- 迈克尔
答案 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后)。