2013-06-06 3 views
3

Ive는 어린 시절부터 MySQL을 사용했으며 여러 가지 이유로 MongoDB로 전환해야합니다.PHP/MongoDB 집계를 사용하여 배열의 문자열 수를 계산하십시오.

모든 PHP 오류를 MongoDB 컬렉션에 저장하는 로그를 작성합니다. 오류를 읽는 것은 문제가되지 않습니다. 간단한 find()를 사용하는 것은 꽤 쉽습니다. PHP 배열을 사용하여 데이터에 접근 할 수 있다는 점이 좋습니다.

이제 오류에 대한 통계를 원합니다. 내 컬렉션은 그래서 다음과 같습니다

{ 
    "_id": ObjectId("51af10ca0e5e723c0a000000"), 
    "Errors": { 
    "2048": { 
     "0": { 
     "Message": "Declaration of ADODB_mysqli::MetaIndexes() should be compatible with ADOConnection::MetaIndexes($table, $primary = false, $owner = false)", 
     "File": "File.php", 
     "Line": NumberInt(29), 
     "Time": NumberInt(1370427591) 
     } 
    }, 
    "2": { 
     "0": { 
     "Message": "Error", 
     "File": "File.php", 
     "Line": NumberInt(29), 
     "Time": NumberInt(1370427591) 
     }, 
     "1": { 
     "Message": "Error", 
     "File": "File.php", 
     "Line": NumberInt(29), 
     "Time": NumberInt(1370427591) 
     } 
    }, 
    "8": { 
     "0": { 
     "Message": "Undefined index: PluginLastAdded", 
     "File": "File.php", 
     "Line": NumberInt(36), 
     "Time": NumberInt(1370427594) 
     }, 
     "1": { 
     "Message": "Undefined index: PluginLastAdded", 
     "File": "File.php", 
     "Line": NumberInt(36), 
     "Time": NumberInt(1370427594) 
     } 
    } 
    } 
} 

지금 내가 알고 싶은 얼마나 자주이 항목 occours에서 각 오류. 2048, 2, 8로 구분 된 목록을 작성한 다음 각 오류의 수를 계산하면 좋습니다.

많은 PHP 코드없이 MongoDB의 집계를 사용하면 가능합니까?

어떤 도움이 될지 모르지만 MongoDB는 MySQL과 180 ° 다른 견해를 가지고 있습니다. 스위치가 꽤 어렵습니다. Sammaye는 위에서 언급 한 무엇에 빌드하려면

+0

한 가지 문제 귀하의 스키마를 사용할 수 있습니다.지도가 축소되어 있지 않으면 스키마를 쉽게 풀거나 집계 할 수 없습니다. 개인적으로 오류 코드가 키가 아니라 문서의 필드가되도록 변경하는 것이 좋습니다 – Sammaye

+0

감사합니다.이 방법을 사용해 보겠습니다. 어쩌면 십자가를 지금 당장 올 수 있습니다. :) – Moe

답변

1

는 실제 배열 다음과 같은 스키마가 더 적합 할 것입니다 :

{ 
    "_id": ObjectId("51af10ca0e5e723c0a000000"), 
    "errors": [ 
     { 
      "code": 2048, 
      "message": "Declaration of ADODB_mysqli::MetaIndexes() should be compatible with ADOConnection::MetaIndexes($table, $primary = false, $owner = false)", 
      "file": "File.php", 
      "line": NumberInt(29), 
      "time": NumberInt(1370427591) 
     }, 
     { 
      "code": 2, 
      "message": "Error", 
      "file": "File.php", 
      "line": NumberInt(29), 
      "time": NumberInt(1370427591) 
     }, 
     { 
      "code": 2, 
      "message": "Error", 
      "file": "File.php", 
      "line": NumberInt(29), 
      "time": NumberInt(1370427591) 
     }, 
     { 
      "code": 8, 
      "message": "Undefined index: PluginLastAdded", 
      "file": "File.php", 
      "line": NumberInt(36), 
      "time": NumberInt(1370427594) 
     }, 
     { 
      "code": 8, 
      "message": "Undefined index: PluginLastAdded", 
      "file": "File.php", 
      "line": NumberInt(36), 
      "time": NumberInt(1370427594) 
     } 
    ] 
} 

배열 구조는 인덱싱 및 쿼리 훨씬 더 간단합니다. 인덱스는 인덱스 인덱싱 array values이며 MongoDB를 사용하면 배열을 쉽게 쿼리 할 수 ​​있습니다. 예를 들어, 특정 오류 (코드와 파일의 조합)를 $elemMatch으로 쿼리 할 수있는 유연성이 있습니다. 또한 errors은 실제 배열이므로 $push 또는 $pull과 같이 다양한 update operators을 사용할 수 있습니다.

중첩 된 개체는 쿼리를 인덱싱하고 작성하는 방식을 제한한다는 점을 고려해야합니다. 앞의 예에서 첫 번째 오류 메시지를 쿼리하는 유일한 방법은 Errors.2048.0.Message이지만 위의 스키마를 사용하면 errors.message에 대한 쿼리가 허용됩니다.

이 배열은 또한 당신이 배열 요소 내에서 값을 다음 $group을 그 $unwind 연산자와 배열을 통해 반복하고 할 수 있도록 특히 때문에, Aggregation Framework 당신을위한 실행 가능한 옵션이 있습니다. 집계 프레임 워크에 대한 MongoDB 문서 외에도 this presentation이 도움이되며 다른 연산자를 시각적으로 살펴볼 수 있습니다. 코드 당 오류의 수를 구하는 방법에 대한 귀하의 이전 질문에

, 다음 통합 프레임 워크 파이프 라인은 전체 컬렉션에있는 모든 문서를 통해이를 계산합니다 :

db.foo.aggregate([ 
    { $unwind: "$errors" }, 
    { $group: { 
     _id: "$errors.code", 
     num: { $sum: 1 } 
    }} 
]); 

마지막으로, 나는를 저장 제안 time 필드를 정수 대신 BSON 날짜 (MongoDate PHP)로 사용하십시오. 그러면 집계 프레임 워크에서 date operators을 사용할 수있는 옵션이 열립니다.

관련 문제