2014-07-04 2 views
1

Mongo에서 데이터베이스 문서 배열의 모든 요소를 ​​일치시키는 방법이 있습니까? 문서와 예를 들어Mongo에서 데이터베이스 문서 배열의 모든 요소와 일치

:

{ 
    Stuff: ['chicken', 'stock'] 
} 

는 어떤 방법으로 입력으로 받아 [ '닭', '맛', '재고']이 문서를 반환하는 쿼리가 있습니까,하지만 같으면 ' 그냥 [치킨]의 입력으로 그것을 반환합니까?

+0

당신이 명확 할 행동이 필요 : 당신이 Stuff이 적어도 하나의 원소가 보장 규정에 $and에 필요한 사람들을 제외하려면? 왜 [a, b, c]는 [a, b]를 반환해야하고 [a]를 반환해야합니까? 규칙을 작성해야합니다. – kranteg

답변

0

당신은 당신의 머리를 추적하기 위해 조금 어렵다 이중 부정을 수행하기 위해 여러 연산자를 결합하여이 작업을 수행 할 수 있습니다 (적어도 그것은 나를 위해!) :

// Find the docs where Stuff only contains 'chicken' or 'stock' elements 
db.test.find({Stuff: {$not: {$elemMatch: {$nin: ['chicken', 'stock']}}}}) 

그래서를 $elemMatch$ninStuff 배열의 단일 요소가 문자열 집합에없는 문서를 찾은 다음 부모 $not이 모든 요소와 일치하지 않는 모든 문서를 반환하도록 일치를 반전합니다.

db.test.insert([ 
    {Stuff: ['chicken']}, 
    {Stuff: ['chicken', 'stock']}, 
    {Stuff: ['chicken', 'flavored', 'stock']} 
]) 

위의 쿼리 반환 :의 문서를 시작으로

{ 
    "_id": ObjectId("53dec1c5393fa0461f92334c"), 
    "Stuff": [ 
    "chicken" 
    ] 
} 
{ 
    "_id": ObjectId("53dec1c5393fa0461f92334d"), 
    "Stuff": [ 
    "chicken", 
    "stock" 
    ] 
} 

단, Stuff 중 하나 없거나에 요소가없는 곳도 문서를 반환 할 것입니다.

db.test.find({$and: [ 
    {Stuff: {$not: {$elemMatch: {$nin: ['chicken', 'stock']}}}}, 
    {'Stuff.0': {$exists: true}} 
]}) 
0

실제로 텍스트 인덱스는 OR 매치이므로 점수에 따라 정렬 할 수 있으므로 가장 일치하는 결과를 쉽게 찾을 수 있습니다. 검색 단어가 많을수록 점수가 좋습니다. 또한 텍스트 검색은 형태소 분석 및 중지 단어를 제공합니다. 주어진 예에서 "닭"과 "닭"은 동일한 결과를 나타냅니다.

db.yourCollection.ensureIndex({"Stuff":"text"}) 
db.yourCollection.find({ $text: { $search:"chicken stock", $language:"en" } },{ score: { $meta: "textScore" } })).sort({ score: { $meta: "textScore" } }).limit(whatEverYouDeemAppropriateInt) 

자세한 내용은 the MongoDB docs about Text Indexes을 참조하십시오.

관련 문제