2012-02-29 2 views
6

필자는 기본적으로 date/int의 키 - 값 쌍의 배열 인 데이터를 저장할 필요가 있습니다. 여기서 날짜는 항상 고유합니다.MongoDB - 연관 배열 키를 사용하여 쿼리 할 수 ​​있습니까?

내가 연관 배열처럼 저장할 수 있도록하고 싶습니다

:. 나는 또한 날짜를 조회 할 수 있어야합니다

array(
    "2012-02-26" => 5, 
    "2012-02-27" => 2, 
    "2012-02-28" => 17, 
    "2012-02-29" => 4 
) 

하지만 (즉, 모든 것을 얻을 경우 날짜> 2012-02-27), 그래서 내가 더 같은 스키마를 사용해야합니다 의심 : 분명히 전자가 훨씬 깨끗하고 간결

array(
    array("date"=>"2012-02-26", "value"=>5), 
    array("date"=>"2012-02-27", "value"=>2), 
    array("date"=>"2012-02-28", "value"=>17), 
    array("date"=>"2012-02-29", "value"=>4), 
) 

,하지만 난 내가 원하는하고있는 방법으로 그것을 쿼리 할 수있을 것입니다, 그렇지 않다면 더 적합한 다른 스키마가 있습니까?

+0

http://www.php.net/manual/en/mongo.queries.php –

+0

날짜를 해당 형식으로 저장하지 않았습니다. 사용 시간(); 기능. 날짜 등을 쉽게 정렬 할 수 있습니다. http://php.net/manual/en/function.time.PHP –

답변

10

두 가지 방법을 설명 했으니까요.

방법 # 1 - 연관 배열

"연관 배열"로 질의를위한 키 도구 $exists 연산자이다. Here은 운영자에 대한 세부 정보입니다. 당신의 설명을 바탕으로

db.coll.find({ $exists: { 'field.2012-02-27' } }); 

$exists 운영자와 잘 일치하지 않는 범위 쿼리를 찾고 있습니다 :

그래서 당신은 확실히 다음과 같은 쿼리를 실행할 수 있습니다. "연관 배열"버전도 색인 생성하기가 어렵습니다.

방법 # 2 - 오브젝트의 배열

이 확실히이 더 나은 쿼리 기능 : 그것은 또한

db.coll.ensureIndex({ 'field.date': 1 }); 

그러나 인덱싱 할 수

db.coll.find({ 'field.date': { $gt: '2012-02-27' } }); 

는 인프라 스트럭처를 변경할이 꺼짐. 특정 날짜의 값을 증가 시키려면이 다루기 힘든 $ 위치 연산자를 사용해야합니다. 이것은 객체의 배열에 대해 작동하지만 추가 중첩으로는 아무 것도 실패합니다. 이러한 방법 중 하나와

다른 문제

한 가지 문제는 데이터의 장기 성장이다. 객체 크기를 확장하면 디스크와 메모리에 더 많은 공간이 필요합니다. 2 년 동안의 가치가있는 객체가있는 경우, 700 개의 항목 전체가 오늘의 데이터를 업데이트하기 위해 메모리에 있어야합니다. 이는 특정 데이터에 대해서는 문제가되지 않을 수도 있지만 고려해야합니다.

같은 맥락에서 MongoDB 쿼리는 항상 최상위 개체를 반환합니다. 다시 말하지만, 700 개의 항목으로 이루어진 배열이있는 경우 일치하는 각 문서에 대해 모든 항목을 가져옵니다. 반환되는 필드를 필터링하는 방법이 있지만 "개체 배열"에서는 작동하지 않습니다.

+0

'2 년 동안의 데이터를 가진 객체가 있다면, 전체 배열 700 개가 메모리에 있어야 현재 데이터를 업데이트 할 수 있습니다.'$ slice '를 사용하여 부분 집합을 제거하면 어떨까요? 배열에 새 항목을 추가하려면'$ push'? –

+0

데이터를 반환하기 위해 작동하지만 날짜 순서대로 밀어 넣을 경우에만 작동합니다. 그러나 서버 측에서는 객체를 전달하는 경우에도 객체 전체를 메모리로 가져와야합니다. –

+0

아 맞아, 나는 그것을 깨닫지 못했다. 나는 그것이 명시된 부분 집합 만 제거 할만큼 똑똑하다고 생각했다. 저의 현재 프로젝트에 대한 약간의 딜 브레이커입니다. 6 개월 동안 라인업을 멈추고 그것을 실현시켜 주셔서 감사합니다! –