2014-10-22 6 views
1

이벤트 기반 응용 프로그램에 Mongoid와 함께 Rails 4를 사용하고 있습니다. 해당 배열에 포함 된 문서가있는 배열 필드를 추가 할 모델을 만들려고합니다. 이 삽입 된 문서에는 사용자의 지역 좌표와 타임 스탬프가 포함됩니다. 5 분마다 사용자의 최신 좌표를 사용자 (위치) 배열로 푸시합니다. 누군가 나를 도와주세요, 어떻게 만들 수 있습니까?다른 문서가 Mongodb (Mongoid)의 임베디드 문서로 포함 된 배열 필드로 모델을 만드는 방법

필자의 샘플 모델과 원하는 문서는 다음과 같습니다. 여기

class User 
    include Mongoid::Document 
    field :name, type: String 

    field :locations, type: Array 

end 

나는

여기

내가 찾고 있어요 샘플 문서입니다 밀어 원하는 결과 :

{ _id : ObjectId(...), 
    name : "User_name", 
    locations : [ { 
       _id : ObjectID(...), 
       time : "...." , 
       loc : [ 55.5, 42.3 ] 
       } , 
       { 
       _id : ObjectID(...), 
       time : "...", 
       loc : [ -74 , 44.74 ] 
       } 
       ] 
} 

나는 통해 임베디드 문서없이 위치 배열의 값을 추가 할 수 있었다 IRB를 사용하지만 나중에 MongoDB의 Geospatial 쿼리를 사용할 것이므로 Mongo Documentation에서 언급 한 2D 인덱스와 나머지 요소를 사용하고 싶습니다. 위도가 &이고 위도가 포함 된 문서 배열이 필요하다고 생각합니다. 그러면 코드 작성 시간도 절약됩니다.

또한 '_id'문서로 위치 시간을 지정할 수 있습니까? (쿼리 오버 헤드를 줄이는 데 도움이 될 수 있습니다.)

누군가가 모델 구조에 대해 도움을 줄 수 있다면 제가 정말로 쓸모가 있습니다.

P.S : mongoDB에 지형 공간 데이터를 저장하는 데 도움이 될만한 추가 참조 자료 나 도움이 필요하면 알려주십시오.

+0

: 대신 (association)_attributes= 방법을 사용하여보다 더 낫다입니다. 쿼리가 작동하는 동안 배열의 항목이 "조건"과 일치하거나 "가까운"위치에있는 것을 "알 수있는"것은 쉽지 않습니다. 데이터가 다른 컬렉션에서 더 나을 때가 종종 있습니다. 어쩌면 먼저 모델을 작성하는 방법을 더 잘 이해하기 위해 예상되는 쿼리 패턴에 대해 몇 가지 질문을해야 할 것입니다. –

+0

@ NeeLunn 위치에 대한 다른 컬렉션을 만든 다음 사용자 문서에 포함 시키면 사용자 문서가 너무 커서 처리 할 수 ​​없습니다. NoSQL으로 작업 한 것은 이번이 처음입니다. 성능 향상에 사용하고 있으며 위치 기반 응용 프로그램을위한 쉬운 API가 될 것입니다.나는 언제나 사용자의 좌표를 얻을 것으로 기대하고 있으며 사용자 수는 수천 명에이를 것이다. 가능한 한 사용자를 1-3 미터 가까이 찾으므로지도를 표시 할 수 있습니다. 그것에 대한 당신의 생각은 무엇입니까? – punkb

+0

내 코멘트의 일반적인 요점과 마찬가지로, 여기에 몇 가지 질문을 게시하고 /하거나 당신이하려고하는 부분을 설명하는 다른 목록을 시도하는 데 도움이 될 수 있습니다. 일반적으로 NoSQL에서는 먼저 문제를 해결 한 다음 다른 방법보다 최적의 데이터 모델을 얻습니다. 이 질문은 단지 mongoid에서 모델을 코딩하는 방법을 묻습니다. –

답변

0

희망이 있으면 도움이 될 것입니다.

문서를 포함 시키려면 embedded_many 이러한 관계를 처리하는 mongoid의 기능을 사용할 수 있습니다. 그것은 당신이

http://mongoid.org/en/mongoid/docs/relations.html#embeds_many

Mongoid 지적뿐만 아니라 포함 된 문서에 색인을 정의 할 수 있습니다, 그 2D 인덱스 배열에 적용해야합니다 다음과 같이 보일 수 있습니다 귀하의 경우 모델에 http://mongoid.org/en/mongoid/docs/indexing.html

:

class User 
    include Mongoid::Document 

    field :name, type: String 

    embeds_many :locations 

    index({ "locations.loc" => "2d" }) 

    accepts_nested_attributes_for :locations # see http://mongoid.org/en/mongoid/docs/nested_attributes.html#common 
end 

class Location 
    include Mongoid::Document 

    field :time, type: DateTime # see http://mongoid.org/en/mongoid/docs/documents.html#fields 
    field :loc, type: Array 

    embedded_in :user 
end 

그러나 중첩 된 특성 인 update을 사용하면 속성을 업데이트 만 할 수는 있지만 삭제하거나 거부 할 수는 없습니다. 그냥 좋은 생각이 아니다, 모델 정의에서 제외 빠르게 이동 지리 공간 쿼리에 대한 배열 내부에 좌표를 배치

@user = User.new({ name: 'John Doe' }) 
@user.locations_attributes = { 
    "0" => { 
    _id : ObjectID(...), 
    time : "...." , 
    loc : [ 55.5, 42.3 ] 
    } , 
    "1" => { 
    _id : ObjectID(...), 
    time : "...", 
    loc : [ -74 , 44.74 ] 
    } 
} 
@user.save! 
+0

관계에 대한 새로운 전체 링크 : [docs.mongodb.com] (https://docs.mongodb.com/ruby-driver/master/tutorials/6.1.0/mongoid-relations/#embeds-many) –