Mongodb: получение вложенного документа напрямую от имени пользователя root - PullRequest
0 голосов
/ 14 мая 2018

Используя проекцию, я получаю вложенный документ, но под ключом, а не от имени root.

Текущий запрос:

db.collection.find({"userId" : {"$ne" : userId}, "gender":{"$in" : interestedin}}, {"profile" : 1, "_id" : 0})

Что возвращается так:

[{"profile":{"firstName":"Payal",...}},{"profile":{"firstName":"Ravinder",...}}...]

Что мне нужно, это:

[{"firstName":"Payal",...},{"firstName":"Ravinder",...}...]

Я задаю этот вопрос, чтобы подтвердить, что существует что-то подобное или нет, поскольку я нашел здесь что-то уместное: https://docs.mongodb.com/manual/reference/operator/aggregation/redact/

Но он использует структуру агрегации.

Образец документа:

{
    "_id": {
        "$oid": "......."
    },
    "id": ".......",
    "facebookId": "......",
    "email": "......@.....com",
    "gender": "....",
    "interestedIn": [
        "....."
    ],
    "isPrivate": false,
    "profile": {
        "name": {
            "firstName": "....",
            "middleName": "",
            "lastName": "....."
        },
        "picture": "........",
        "dob": 1111138064533,
        "meta": {
            "education": [],
            "interests": [],
            "music": [],
            "movies": [],
            "tvSeries": []
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

@ mickl ответ идет в правильном направлении, но я хочу дополнить его ответ, так как его синтаксис неправильный.

Используйте $replaceRoot для перевода документа на верхний уровень.Он работает только с объектом , поэтому вы хотите использовать $unwind для извлечения данных массива до продвижения вложенного объекта:

db.collection.aggregate([
    { $match: {"userId" : {"$ne" : userId}, "gender":{"$in" : interestedin}} },
    { $unwind: "$profile"},
    {
        $replaceRoot: {
            newRoot: "$profile"
        }
    }
])
0 голосов
/ 14 мая 2018

Вы можете использовать оператор $ replaceRoot для перевода вложенного объекта на корневой уровень, попробуйте:

db.collection.aggregate([
    { $match: {"userId" : {"$ne" : userId}, "gender":{"$in" : interestedin}} },
    {
        $replaceRoot: {
            newRoot: "$profile.name"
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...