我有一个应用程序,它使用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个对象只需要不到一秒钟的时间。然而,我最近将数据库移到了互联网上的一个服务器上,对于相同数量的对象,这个查询大约需要30秒才能执行。
此外,查看mongoDB日志,它似乎打开了大约8-10个到数据库的连接来执行此查询。
所以我想要做的是在数据库中查询一个primaryKeys数组,并一次得到它们,然后在一个循环中进行解析,如果可能的话,使用一个连接。
我如何优化我的查询来做到这一点呢?
谢谢,
--迈克尔
发布于 2011-01-12 13:32:12
您想要使用$in。$or也可以工作,但更冗长,只支持更新的版本(我相信是1.5.4之后)。
发布于 2011-01-12 03:19:44
听起来您要查找的是查询中神奇的"$in“语句。我不熟悉C#,但在json中,您可能会看到类似于以下内容的查询:
query = {
'primaryKey': {
'$in': [
'val1',
'val2',
'val3'
]
}
}当调用.find()时,上面的代码将以游标的形式返回结果列表,而不是现在提交单个primaryKey并调用findOne()。
find()返回一个游标(与返回数据结构的findOne()相反),因此要访问数据,您必须遍历游标对象以获取每个文档。
希望这能有所帮助!请随时在评论中提出更具体的问题。
MongoDB $or参考:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
C# find()引用:http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods
https://stackoverflow.com/questions/4661409
复制相似问题