Как написать запрос Mongo для поиска вспомогательного документа с условием

У меня есть документ в подобной коллекции, мне нужно найти запись с form_Id: 1 и Function_Id: 2, как написать запрос mongo.

"Form_Id" : 1,
"Function" : [{
  "Function_Id" : 1,
  "Role" : [{
      "Role_Id" : 1,
      "UserId" : ["Admin", "001"]
    }]
}, {
  "Function_Id" : 2,
  "Role" : [{
      "Role_Id" : 2,
      "UserId" : ["Admin", "005"]
    }]
}]

Ответ 1

Для этого вы можете использовать точечную нотацию и $ оператор позиционной проекции:

db.test.find({Form_Id: 1, 'Function.Function_Id': 2}, {_id: 0, 'Function.$': 1})

возвращает:

{"Function": [{"Function_Id": 2, "Role": [{"Role_Id": 2, "UserId": ["Admin", "005"]}]}]}

Ответ 2

Поскольку ваш функциональный ключ является массивом, чтобы использовать оператор $match, сначала вам нужно использовать оператор $unwind. http://docs.mongodb.org/manual/reference/aggregation/unwind/ И затем вы используете оператор $match для поиска документов, которые вы хотите http://docs.mongodb.org/manual/reference/aggregation/match/

Итак, ваш запрос должен выглядеть так:

    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}}])

По умолчанию mongo отобразит _id документа. Поэтому, если вы не хотите отображать _id, после сопоставления с соответствующими, вы можете использовать оператор $project http://docs.mongodb.org/manual/reference/aggregation/project/

     db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Form_id":1,"Function":1}}])

Если вы не хотите, чтобы form_id отображался, просто не указывайте form_id в части проекта запроса. По умолчанию mongo будет отображать только клавиши, значение которых равно 1. Если ключ не указан, он не отображает его.

    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Function":1}}])