2017-01-03 3 views
1

Я новичок в Mongo, поэтому любая помощь оценивается.Получите конкретные значения от MongoDB

У меня есть объект User и в нем есть еще несколько объектов, которые размещают данные клиента на основе взаимодействия Пользователя с каждым из них.

Вот как это выглядит

db.users.findOne(
    {"clients.clientId":35}, 
    {"clients.clientId":1} 
) 
{ 
    "_id" : ObjectId("586670e6ce9287cf6d197d14"), 
    "clients" : [ 
     { "clientId" : 35 }, 
     { "clientId" : 67 }, 
     { "clientId" : 73 }, 
     { "clientId" : 78 }, 
     { "clientId" : 82 } 
    ] 
} 

Как вы можете видеть из моего запроса, он возвращает пользователя, который имеет данные от клиента 35, но и возвращает данные от любого другого клиента.

Как я могу получить доступ только к данным от клиента 35?

+3

Попробуйте это 'db.users.findOne ({" clients.clientId ": 35}, {" clients. $ ": 1})' – Veeram

+0

@SagarReddy, пожалуйста, объясните немного, что вы предложили? что такое клиенты. $? – Geo

+2

docs.mongodb.com/manual/reference/operator/update/positional. Часть запроса идентифицирует строку и часть проекта использует оператор $ positional для отображения согласованного значения – Veeram

ответ

2

У вас есть встроенный массив документов на ключ clients.

В запросе прогноза {"clients.clientId":1} указано, что запрос должен вернуть только этот ключ, clients. Поле clients представляет собой массив, поэтому все внедренные документы из массива будут извлечены (проецированы).

Если вы хотите только один элемент в массиве, который будет отображаться, то один определенный в запросе т.е. клиента с идентификатором 35 {"clients.clientId":35}, необходимо использовать projection positional operator $:

db.users.findOne({"clients.clientId":35},{"clients.$":1}) 

Результат:

{ 
    "_id" : ObjectId("586670e6ce9287cf6d197d14"), 
    "clients" : [ 
     { 
      "clientId" : 35 
     } 
    ] 
} 

Примечание: используя оператор $, он будет проектировать только первый элемент в массиве, который соответствует запросу; если у вас больше документов в массиве с одинаковым значением, будет отображаться только первый.

+0

У меня есть все, что связано с клиентом 35 в том же документе. Это нормально? – Geo

+0

да, это будет нормально – sergiuz

Смежные вопросы