2014-02-22 2 views
0

이것은 mongodb에있는 컬렉션의 샘플 구조입니다. 마찬가지로 60 개 이상의 유사한 레코드가 하나의 컬렉션에 있습니다. 우리는 mongodb로 이동하여 빠른 액세스 성능을 보았습니다. 그러나 이제는 evean의 간단한 검색에 엄청난 시간이 걸립니다. 검색 매개 변수에 대한 색인을 지정했습니다. 이름 검색 (검색 매개 변수 MNG_FIRST_NAME, MNG_MIDDLE_NAME, MNG_LAST_NAME, MNG_ALIASIST.AKAFIRST_NAME, MNG_ALIASIST.AKALAST_NAME) mongodb와 올바른 방법을 따르고 있습니다.간단한 검색 쿼리로 몽고 성능 문제가 있습니다.

아래 코드 샘플과 컬렉션 구조를 사용하고 있습니다.

{ 
    "_id" : ObjectId("5308e2e1f525bc0f0472cbf6"), 
    "MNG_UID" : "1389120", 
    "MNG_CATEGORY" : "OFFICER", 
    "MNG_FIRST_NAME" : "JOHN", 
    "MNG_LAST_NAME" : "DOE", 
    "MNG_MIDDLE_NAME" : "MARK", 
    "MNG_CREATEDON" : "2010-11-19", 
    "MNG_UPDATEDON" : "2014-01-01", 
    "MNG_TITLE" : "Dr", 
    "MNG_REMARKS" : "", 
    "MNG_TYPE" : "WORLDCHECK", 
    "MNG_PROGRAMLIST" : [], 
    "MNG_IDLIST" : [], 
    "MNG_ALIASIST" : [ 
     { 
      "AKAUID" : "101", 
      "AKATYPE" : "ALIAS", 
      "AKACATEGORY" : "", 
      "AKAFIRST_NAME" : "JOHNNY TURA, DOE", 
      "AKALAST_NAME" : "" 
     }, 
     { 
      "AKAUID" : "102", 
      "AKATYPE" : "ALIAS", 
      "AKACATEGORY" : "", 
      "AKAFIRST_NAME" : "MARK TURA, DOE", 
      "AKALAST_NAME" : "" 
     } 
    ], 
    "MNG_ADDRESSLIST" : [ 
     { 
      "ADDRESSUID" : "", 
      "ADDRESS1" : "Dakar", 
      "ADDRESS2" : "Dakar", 
      "ADDRESS3" : "SENEGAL", 
      "ADDRESSCITY" : "Dakar", 
      "ADDRESSCOUNTRY" : "SENEGAL", 
      "ADDRESSPOCODE" : "", 
      "ADDRESSSTATE" : "Dakar" 
     } 
    ], 
    "MNG_NATIONALITYLIST" : [ 
     { 
      "NATUID" : "", 
      "NATCOUNTRY" : "ISRAEL", 
      "NATMAINENTRY" : "" 
     }, 
    { 
      "NATUID" : "", 
      "NATCOUNTRY" : "AMERICIAN", 
      "NATMAINENTRY" : "" 
     } 
    ], 
    "MNG_CITIZENSHIPLIST" : [], 
    "MNG_DOBLIST" : [], 
    "MNG_PLACEOBLIST" : [], 
    "MNG_ADDINFOLIST" : [] 
} 

코드는 성능을 높이기 위해 몇 가지 솔루션을 도와주세요 MongoDB를의 C#을 드라이버에

string MNG_REMTNAME = "JOHN"; 

    var collection = mongoDB.GetCollection<EMPLOYEES>("EMPLOYEES"); 

    if (!string.IsNullOrEmpty(MNG_REMTNAME)) 
    { 
     IMongoQuery MFName = new QueryDocument(); 
     MFName = Query.Or(Query.Matches("MNG_FIRST_NAME", MNG_REMTNAME.ToUpper()), 
       Query.Matches("MNG_MIDDLE_NAME", MNG_REMTNAME.ToUpper()), 
       Query.Matches("MNG_LAST_NAME", MNG_REMTNAME.ToUpper()), 
       Query.ElemMatch("MNG_ALIASIST", Query.Or(Query.Matches("AKAFIRST_NAME", 
MNG_REMTNAME.ToUpper()))) 
       ); 
    } 
    var colln = collection.Find(MFName).ToList(); 

를 사용하여 수집을 얻기 위해 사용.

답변

0

변경이 하나

Query.ElemMatch("MNG_ALIASIST", Query.EQ("AKAFIRST_NAME", MNG_REMTNAME.ToUpper())) 

에 대한 행

Query.ElemMatch("MNG_ALIASIST", Query.Or(Query.Matches("AKAFIRST_NAME", 
MNG_REMTNAME.ToUpper()))) 

은 또한 적절한 인덱스가없는 한 MongoDB를 배열에서 검색하는 것은 매우 비싼 것을 명심해야합니다. 따라서 최소한 MNG_ALIASIST 필드의 색인이 있어야합니다. AKAFIRST_NAME, AKALAST_NAME -

이 필드 나 배열 MNG_ALIASIST의 이름을 찾고 코드 sample..i'm 수정 한 http://docs.mongodb.org/manual/core/index-multikey/

+0

Multikey 대한 인덱스를 생성 고려한다. 나는이 매개 변수들에 대해서도 색인을 주었다. – deepu

+0

그래서 성능이 향상 되었습니까? –

+0

아직 시간이 걸리지 않습니다 ... 하나의 경기에도 시간이 걸립니다. – deepu

관련 문제