Как написать запрос 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}}])