2013-10-04 2 views
7

다음 데이터가 MongoDB에 있습니다 (내 질문에 필요한 단순화 된 항목).배열의 첫 번째 요소의 속성을 찾기위한 MongoDB 쿼리

{ 
    _id: 0, 
    actions: [ 
     { 
      type: "insert", 
      data: "abc, quite possibly very very large" 
     } 
    ] 
} 
{ 
    _id: 1, 
    actions: [ 
     { 
      type: "update", 
      data: "def" 
     },{ 
      type: "delete", 
      data: "ghi" 
     } 
    ] 
} 

내가 원하는 것은 각 문서에 대한 첫 번째 작업 유형을 찾는 것입니다.

{_id:0, first_action_type:"insert"} 
{_id:1, first_action_type:"update"} 

(데이터가 다르게 구조화 된 경우는 괜찮지 만 어떻게 든 그 값이 존재해야합니다.)

편집 : 나는 db.collection.find({}, {'actions.action_type':1})을 시도했지만, 분명히 그 행동 배열의 모든 요소를 반환 .

NoSQL은 나에게 상당히 새로운 것입니다. 전에는이 모든 것을 관계형 데이터베이스의 두 테이블에 저장하고 SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d과 같은 작업을 수행했습니다.

+1

간단하게'... actions [0]'for'collection .find method' –

+0

이 문서는 크기가 크며 ... 필요한 것을 얻는 데 도움이되는 프로젝션이나 무언가를 사용하려고합니다. –

+0

당신은 인덱스를 추가 할 수 있습니다 –

답변

11

. (그러나 배열에 대한 순서는 업데이트 할 때 동일하지 않음을 명심하십시오)

db.collection.find({},{'actions':{$slice:1},'actions.type':1}) 
1

은 또한 버전 2.2에 도입 된 Aggregation Pipeline을 사용할 수 있습니다 : 당신은 프로젝션 $slice 연산자를 사용할 수 있습니다

db.collection.aggregate([ 
    { $unwind: '$actions' }, 
    { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } } 
]) 
+0

그것은 전체 배열을 되돌려 줄 것이고 그룹 앞에 unwind가 필요합니다. db.collection.aggregate ({$ unwind : '$ actions'}, {$ group : {_id : "$ _id", first_action_type : {$ first : "$ actions.type"}}}}) – attish

+0

구문 오류 :'{ "$ actions.type"}' –

+0

@PaulDraper 미안하지만 오타가있었습니다. 고정, 이제 시도해 볼 수 있습니다 :) – Agis

관련 문제