2016-08-29 5 views
1

하자를 정규식 우리는이 같은 구조의 컬렉션이 말 :: 배열의 특정 요소에 대한

{ 
    _id:1, 
    tag:["speaker","tom"] 
}, 
{ 
    _id:2, 
    tag:["subject","tomatoes"] 
} 
{ 
    _id:3, 
    tag:["subject","space"] 
} 

내가 같은 특정 요소에 대한 조회 할 수 있습니다

db.tags.find({tag:["speaker","tom"]}) 

은 지금이다 해당 배열의 요소와 일치하는 정규식을 사용하여 쿼리를 수행 할 수 있습니까? 무엇인가 :

db.tags.find({tag:["speaker",/tom.*/]}) ? 

분야 tag에 정규 표현식 (예 : db.tags.find({tag:/sp.*/}))를 전체 배열을 일치합니다, 나는 고려하기 전에 ... 그것은 단지 두 번째에 검색 할 수있는 방법을 찾고 있어요 그 컬렉션을 재구성해야합니다.

업데이트는 해결 방법은 $all 연산자를 사용하는 것입니다

:

db.tags.find({tag:{$all : ["speaker",/tom.*/]} }) 

하는 것과 같습니다, 그 이후 할 수있는 올바른 방법 그러나

db.tags.find({ $and: [ { tag: "speaker }, { tags: /tom.*/ } ] } 

을 아니다 두 요소 모두 문자열과 정규식을 검색합니다.

답변

1

나 자신을 사용할 수 있습니다. 집합 프레임 워크를 사용하면 이런 식으로 할 수 있다는 것을 알았습니다.

db.tags.aggregate([ 
    {$match: {"tag.1" : {$exists: 1}}}, 
    {$project: {one: {$slice: ["$tag", 1]}, two: {$slice: ["$tag", 1,2]}}}, 
    {$match: {one: "speaker", two: /tom.*/}} 
]) 

첫 번째 부분에는 최소한 두 개의 요소가 있어야합니다. 첫 번째 요소를 one에 투영하고 두 번째 요소를 slice를 사용하여 two에 놓은 다음 각 배열의 단일 요소와 일치시킵니다.

그런 다음 ID를 가져 와서 원래 컬렉션으로 돌아가서 다른 쿼리를 실행하거나 더 많은 예측을 추가하고 집계 프레임 워크에서 필요한 데이터를 추출 할 수 있습니다.

+0

예 죄송합니다. 나는이 쿼리가 db.tags.find ({ "tag.1": {$ exists : 1}})를 사용하기 때문에 find와 비슷한 것을 할 수 있다고 생각했기 때문에 그렇게 생각하지는 않습니다. – ThrowsException

+1

절대적으로 : 구원받은 이상 : absolved! – Flint

관련 문제