2012-05-04 4 views
0

MongoDB/Mongoose에서 "where $ in"쿼리를 사용하여 배열의 각 태그에 대해 하나의 결과 만 반환하려고합니다. 종류는 다음과 같습니다.MongoDB 쿼리 - 태그 배열에서 각각 하나를 찾습니다.

db.images.find({ hashtag : { $in : ['tag1', 'tag2', 'tag3'] } }); 

그리고 나는 3 가지 독특한 결과를 얻었습니다. 각각의 태그 집합에서 가져옵니다.

[{name:'image1', hashtag:'tag1'}, 
{name:'image55', hashtag:'tag2'}, 
{name:'image99', hashtag:'tag3'}] 

SQL에서는 GROUP BY와 같은 것을 사용하지만 Map/Reduce를 수행하지 않고 MongoDB에서 해당 항목을 찾을 수 없습니다.

어쨌든 그렇게하니? 감사.

--edit 내가 될 원하는에 대한 동등한 SQL : 당신의 2.2 출시를 기다리고있는 것처럼 이상적으로

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag; 

또는 MongoDB를 더 무작위

SELECT * FROM images WHERE hashtag in ('tag1', 'tag2', 'tag3') GROUP BY hashtag ORDER BY rand(); 
+0

문서의 모양을 분명히 할 수 있습니까? 이름과 해시 태그 배열입니까? 실제로 SQL 그룹이 당신을 위해 어떤 역할을하는지 보지 못합니다 - tag1을 가진 단일 이미지 이름, tag2를 가진 단일 이미지 이름 및 tag3을 가진 단일 이미지 이름을 원하는 것처럼 보입니까? 나는 심지어 이것이 당신의 어플리케이션에서 쉽게 풀릴 수 있는지조차 확신 할 수 없다. –

+0

아니, 나의 문서는 실제로 그렇게 보이지 않는다. 이것은 내가 성취하고자하는 일의 예일뿐입니다. – 12vunion

+0

SQL은 매우 간단합니다 : SELECT * FROM'images' where 'hash1', 'tag2', 'tag3'에서 'hashtag'WHERE GROUP BY'hashtag'; – 12vunion

답변

0

이 없습니다 비록 소리 MongoDB에는 배열을 여러 결과로 푸는 데 사용할 집계 파이프 라인이 포함됩니다. aggregation framework가 당신을 수 있습니다 - (테스트에만 사용할 수 있지만 하지 생산 개발 버전 2.1.1로 현재)

http://www.mongodb.org/display/DOCS/Aggregation

+0

당신은 http : //www.mongodb를 링크하려고 생각합니다.org/display/DOCS/Aggregation + Framework을 사용하는 것이 좋습니다. –

0

나는 2.0이 아니라 2.2에서이 작업을 수행 할 수있는 방법을 찾을 수 없습니다 그것은이를 좋아합니까 (단지 예로서, 나는 확실히 다른 방법도 가능 해요) :

db.images.aggregate( 
     {$match : {hashtag: {$in:["tag1","tag2"]}}}, 
     {$group : {_id:"$hashtag", name: {$first:"$name"}}}, 
     {$project : {hashtag:"$_id", name: "$name", _id:0}} 
) 

반환 :

{ 
     "result" : [ 
     { 
      "hashtag" : "tag2", 
      "name" : "1" 
     }, 
     { 
      "hashtag" : "tag1", 
      "name" : "1" 
     } 
    ], 
    "ok" : 1 
    } 

귀하의 문서가 {name : "xxx", hashtag : "tagX"}의 형식으로 가정하고 많은 이름이 각 해시 태그에 해당합니다. 집계 파이프 라인이하는 일은 $ match를 사용하여 해시 태그가 "tag1"또는 "tag2"인 작업 집합으로 제한 한 다음 해시 태그로 그룹화하고 각 그룹화의 첫 번째 결과 만 유지하려고한다고 지정합니다 ($ 마지막으로 또 다른 옵션입니다.) -이 이름이 단지 하나 인 경우 이름을 다시는 알지 못한다고 가정합니다. $ project는 필드 이름 "hashtag"에 필요한 그룹 _id를 매핑하는 데 사용됩니다.