2013-02-14 4 views
0

의 일치 배열 내가 거기에 하위 객체의 배열이 객체있다 :몽고, 배열

_id: "9", 
     clients: [ 
      { 
       id: 677, 
       enabled: true, 
       updated: 0, 
       created: 1352416600 
      }, 
      { 
       id: 668, 
       enabled: true, 
       updated: 0, 
       created: 1352416600 
      } 
     ], 
     cloud: false, 
     name: "love", 
} 

이 사용자는 클라이언트 ID 677과 이미지에 대한 요청을은, 상기 목적은

을 반환됩니다

사용자는 클라이언트와 이미지에 대한 요청 (677) 및 (668)를 IDS하게, 상기 이미지

반환되어 사용자는 677, 668, 690는, 상기 화상

반환되지 IDS 클라이언트와 이미지에 대한 요청을

PHP와 Mongo DB를 사용하고 있습니다. COUNT 및 하위 쿼리를 사용하는 데 사용되는 이것을 사용하는 MYSQL 쿼리.

나는 몽고에서이 문제를 다루기 시작 해야할지 전혀 모른다.

도움을 주시면 감사하겠습니다.

답변

2

배열 내부의 문서를 검색하려면 도트 표기법과 "$ and"연산자를 사용할 수 있습니다.

구문 : 당신이 샘플에 대한

db.coll.find({"$and": [{"clients.id": <id1>}, {"clients.id": <id2>}, ... ]}); 

:

1) 사용자가 하나 개의 항목에 대한 클라이언트 ID 677 (와 이미지에 대한 요청을 "$와"의 필요가 없습니다, 하지만 당신은) 어쨌든 사용할 수 있습니다

db.coll.find({"clients.id": 677}); 

또는

db.coll.find({"$and": [{"clients.id": 677}]}); 

2) 사용자는 클라이언트와 이미지에 대한 요구 ID를 만든다 677 및 668 :

db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}]}); 

3) 사용자가 클라이언트와의 이미지를 요청하는 IDS 677, 668, 690 :

db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}, {"clients.id": 690}]}); 
+0

다시 한번 감사합니다. 이것은 훨씬 더 복잡합니다. – azz0r

+0

2)와 3)은 하나의 JS 개체에서 동일한 키를 여러 번 가질 수 없기 때문에 정확하지 않습니다. 쇼처럼'$와'를 사용하면 괜찮을 것입니다. – JohnnyHK

+0

@ johnnyHK, 가능한 언어에 따라 다릅니다. 그리고 몽고 껍질도 그것을 받아 들인 것처럼 보입니다. 내가 쿼리를 사용하는 중임을 기억하지 못한다. 그러나 그렇습니다. "$ and"옵션이 꽤 괜찮은 것 같습니다. – MatheusOl

0

세 번째로 쉬운 방법이 있습니다.

db.foo.find ({ "clients.id": {$ in : [677,688,690]}});

희망이

/Nodex

을하는 데 도움이

편집 :

당신이 문서를 반환하려는 당신이 경우에 그

+0

"$ in"연산자는 모두가 아닌 일부와 일치합니다. $ all 연산자 또는 $는 올바른 방법 인 것 같습니다. – MatheusOl

1

에 대한 elemMatch을 $ 사용할 수있는 정확한 구조와 일치해야하는 경우 배열 필드에는 $all 연산자를 사용할 수있는 항목 목록이 각각 들어 있습니다.사용자는 클라이언트 ID와 이미지에 대한 요청을

db.coll.find({'clients.id': 677}); 

2) :

1) 사용자가 677 클라이언트 ID와 이미지에 대한 요청을 :로

그래서 삼가지 경우는 처리 할 수 677 및 668 :

,174,515 : 사용자가 이미지 요청을

db.coll.find({'clients.id': {$all: [677, 668]}}); 

3) 클라이언트 677, 668, 및 690과 IDS

db.coll.find({'clients.id': {$all: [677, 668, 690]}});