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", 
} 

Пользователь делает запрос для изображений с идентификатором клиента 677, вышеупомянутый объект будет возвращен

пользователь делает запрос для изображений с клиентом идентификаторы 677 и 668, указанное изображение возвращается

пользователь делает запрос для изображений с клиентом идентификаторы 677, 668, 690, указанное изображение не возвращается

Я использую PHP и Mongo DB. Запрос MYSQL, используемый для использования этого параметра, использовался для использования COUNT и подзапроса.

Я понятия не имею, где можно начать заниматься этим в Монго.

Любая помощь приветствуется.

ответ

2

Для поиска документов внутри массивов вы можете использовать точечную нотацию и оператор «$ и».

Синтаксис:

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

Для вас образцов:

1) Пользователь делает запрос для изображений с идентификатором клиента 677 (только для одного элемента, нет необходимости «$ и», но вы можете использовать в любом случае):

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

или

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

2) Пользователь делает запрос для изображений с клиентом идентификаторы 677 и 668:

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

3) Пользователь делает запрос для изображений с клиентом идентификаторы 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, в зависимости от языка, который вы можете. И кажется, что оболочка манго принимает его также. Обратите внимание, что я не храню его, просто используя в запросе. Но да, варианты «$ и» выглядят довольно хорошо. – MatheusOl

0

Существует третий и более простой метод.

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

Надеется, что это помогает

/Nodex

Edit:

Если вам нужно, чтобы соответствовать точной структуре вы можете использовать $ elemMatch для этого

+0

Оператор «$ in» будет соответствовать любому, не все. Оператор $ all или $ и, кажется, правильный путь. – MatheusOl

1

Для случаев, когда вы хотите, чтобы вернуть документы где поле массива содержит каждый из списка элементов, вы можете использовать оператор $all.

Так что ваш три случая может быть обработан как:

1) Пользователь делает запрос для изображений с идентификатором клиента 677:

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

2) Пользователь делает запрос для изображений с клиентскими идентификаторами 677 и 668:

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

3) пользователь делает запрос для изображений с клиентом идентификаторы 677, 668 и 690:

db.coll.find({'clients.id': {$all: [677, 668, 690]}}); 
Смежные вопросы