mongodb возвращает только поддокумент, опрашивая поле - PullRequest
0 голосов
/ 05 июля 2018

У меня есть такая структура:

{
"_id" : ObjectId("5b155aa3e7179a6034c6dd5b"),
"pinnedKpi" : {
    "Ver01" : [
        "130",
        "138",
        "122",
        "134"
    ],
    "Ver02" : [
        "265",
        "263",
        "142",
        "264"
    ],
    "Ver03" : [ ],
    "Ver04" : [
        "126",
        "134",
        "122",
        "138"
    ]
},
"email" : "john@doe.ca",

Можно ли выполнить запрос, например, вернуть только массив, в котором email = john@doe.ca и pinnedKpi.Ver01 ---> ["130","138","122","134"]

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

если массив не должен быть корневым элементом ответа, вы можете использовать следующий запрос для возврата массива pinnedKpi.Ver01 с критериями электронной почты и присутствием элемента Ver01 в массиве pinnedKpi:

    db.test1.find(
      {"email" : "john@doe.ca", "pinnedKpi.Ver01" : {"$exists" : true}},
    {"pinnedKpi.Ver01" : 1}
    );

Какой выход:

{ 
    "_id" : ObjectId("5b155aa3e7179a6034c6dd5b"), 
    "pinnedKpi" : {
        "Ver01" : [
            "130", 
            "138", 
            "122", 
            "134"
        ]
    }
}

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

db.test1.aggregate(
    [
        {
            $match: {email:"john@doe.ca","pinnedKpi.Ver01":{$exists:true}}
        },
        {
            $replaceRoot: {
            newRoot: "$pinnedKpi"
            }
        },
        {
            $project: {
               Ver01:1
            }
        },
    ]
);

Выход:

{ 
    "Ver01" : [
        "130", 
        "138", 
        "122", 
        "134"
    ]
}
0 голосов
/ 05 июля 2018

Просто используйте это:

db.collection.find({ // find all documents
    "email": "john@doe.ca" // where the "email" field equals some value
}, {
    "_id": 0, // do not return the "_id" field (included by default)
    "pinnedKpi.Ver01": 1 // only return the "pinnedKpi.Ver01" field
})
...