배열 필드에 MongoDB의 고유 값 또는 다른 배열이 포함되어 있는지 확인하는 방법은 무엇입니까?


143

지금 mongodb를 사용하고 있습니다.

블로그 포스트 모음이 있고 블로그 포스트에 배열 인 태그가 있습니다. 예 :

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

이 검색을 어떻게 수행 할 수 있습니까

  1. 'tag1'포함
  2. [ 'tag1', 'tag2'] 포함
  3. [ 'tag3', 'tag4'] 중 하나를 포함

답변:


219

이것을 시도하십시오 :

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3


2
왜냐하면 $ all은 모든 요소를 ​​의미하며 표현 된 순서대로, 아니면 순서가 맞지 않습니까?
redben

2
@ScottHernandez 나는 그들이 검색으로 사용하는 필드가 배열이 될 수 있다고 언급하지 않았으며 어떻게 처리되는지 언급하지 않았습니다. "field : {$ in : 배열}". 배열 배열 내에서 배열을 검색하면 어떻게됩니까? 명시되지 않은.
Zut

배열에서 중복을 중지하기 위해 수행 할 수있는 INDEXING이 있습니까? 그렇다면 어떻게 안내하십시오.
Hitesh Joshi

1
@redben은 문서에 작성된 것과 같이 순서가 맞지 않습니다 : $ all operator DOCS . 예제 부분을 읽으면 알 수 있습니다.
Matthias B

5

내 경험은 (2) 다음 솔루션이 "$ all"솔루션보다 훨씬 빠르다는 것입니다.

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

그러나 솔직히 말해서, 나는 이유가 아닙니다. 누구나 알고 있다면 관심이 있습니다.


1
그건 그렇고, 색인 키워드 목록에서 테스트했습니다. $ and와 $ all
isox

그 동안 새로운 버전으로 변경되었을 수 있습니다.
heinob

정황입니다. "$ and"의 경우 mongodb는 논리적 "and"작업을 수행합니다. 따라서 첫 번째 표현이 거짓이면 두 번째 표현은 고려되지 않습니다. 이는 처리량이 적다는 것을 의미합니다.
kubudi

그러나 그것은 '$ all'에서도 발생해야합니다. 그렇지 않아야합니다!?
heinob

1
$ all은 아마도 인덱스에서 두 번의 조회 일 것이고, $는 아마도 결과에 대한 순차적 스캔으로 하나의 조회 일 것입니다.
Evan Carroll
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.