当我在$或函数中使用大量条件进行MongoDB查询时,我遇到了一种奇怪的行为。
基本上发生的事情是100个结果在DBCursor中瞬间循环,并且以下5000个结果在2分钟后循环!
这是代码(进行查询的方法):
public Object getMongoData(String aDbName, String aCollectionName, DBObject aQueryObj, DBObject aSortObj, boolean aFindOne,
DBObject aFieldsFilter, int aLimitStartPosition, int aLimitNumberResults, boolean aCreateIndex) throws Exception
{
// String aDbName MY_DB
// String aCollectionName = MY_COLLECTION
// DBObject aQueryObj = {"$or":[{"_id":"id1"},…,{"_id":"id5000"}]}
// DBObject aSortObj = null
// boolean aFindOne = false
// DBObject aFieldsFilter = null
// int aLimitStartPosition = 0
// int aLimitNumberResults = 0
// boolean aCreateIndex = false
Object resultObj = null;
DBObject query;
DBObject filter;
if (aQueryObj == null)
{
query = new BasicDBObject();
}
else
{
query = aQueryObj;
}
if (aFieldsFilter == null)
{
filter = new BasicDBObject();
}
else
{
filter = aFieldsFilter;
}
DBCollection collection = loadCollection(aDbName, aCollectionName);
if (collection != null)
{
if (aFindOne)
{
resultObj = collection.findOne(query, filter);
}
else
{
if ((aSortObj != null) && !aSortObj.keySet().isEmpty())
{
if (aCreateIndex)
{
collection.createIndex(aSortObj);
}
resultObj = collection.find(query, filter).skip(aLimitStartPosition).limit(aLimitNumberResults).sort(aSortObj);
}
else
{
resultObj = collection.find(query, filter).skip(aLimitStartPosition).limit(aLimitNumberResults);
}
}
}
return resultObj;
}
代码(调用以前方法并循环结果的代码):
dbCursor = (DBCursor) getMongoData(super.getMainDatabaseName(), aCollectionName, aQueryObj, aSortObj, false, aFilterObj);
if (dbCursor != null)
{
int i = 0;
while (dbCursor.hasNext())
{
DBObject dbObject = dbCursor.next();
logger.debug("SEARCH FINISHED COUNT: " + dbCursor.count() + "\t CURRENT: " + i);
i++;
}
}
知道为什么会这样吗?
谢谢
答案 0 :(得分:0)
由于 $或功能仅按一个参数查询( _id ),我开始使用 $ in 并解决问题
https://docs.mongodb.org/manual/reference/operator/query/in/