Как вывести значение по индексу массива в Mongodb? - PullRequest
0 голосов
/ 29 декабря 2018

Вот моя коллекция

{
        "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
        "name" : "Sherlock",
        "mobile" : "999999",
        "adress" : [
                {
                        "street" : "221b baker street",
                        "city" : "london"
                },
                {
                        "street" : "ben street",
                        "city" : "london"
                }
        ],
        "tags" : [
                "Detective",
                "Magician",
                "Avenger"
        ]
}

Теперь я хочу получить первое или второе значение внутри массива адресов.для этого я использую эту команду.

> db.agents.findOne({"name" : "Sherlock"},{"adress" : 1})

, но вместо того, чтобы давать один результат, он дает весь массив, как

{
        "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
        "adress" : [
                {
                        "street" : "221b baker street",
                        "city" : "london"
                },
                {
                        "street" : "ben street",
                        "city" : "london"
                }
        ]
}

Это можно сделать, сравнив значение массива как

 db.agents.find({"adress.street": "ben street"}, {_id: 0, 'adress.$': 1});

Но я не хочу сравнивать только для печати индексов массива.Как я могу получить единый результат?Любая помощь приветствуется ..

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Вы можете использовать $arrayElemAt, чтобы получить конкретный элемент из массива

db.collection.aggregate([
  { $addFields: { "$arrayElemAt": ["$adress", 0] }}   //index
])

, и если вы хотите получить нарезанный элемент, вы можетеиспользуйте $slice проекция

db.collection.find({}, { adress: { $slice: [2, 1] }})  // 2 index and 1 number of element
0 голосов
/ 29 декабря 2018

Вы можете $unwind с помощью includeArrayIndex, чтобы получить индекс массива адресов

db.t11.aggregate([
    {$match : {"adress.street" : "ben street"}},
    {$unwind : {path : "$adress", includeArrayIndex : "idx"}},
    {$match : {"adress.street" : "ben street"}}
]).pretty()

, вы можете добавить $project, чтобы отфильтровать поля, не обязательные

результат

> db.t11.aggregate([{$match : {"adress.street" : "ben street"}},{$unwind : {path : "$adress", includeArrayIndex : "idx"}},{$match : {"adress.street" : "ben street"}}]).pretty()
{
        "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
        "name" : "Sherlock",
        "mobile" : "999999",
        "adress" : {
                "street" : "ben street",
                "city" : "london"
        },
        "tags" : [
                "Detective",
                "Magician",
                "Avenger"
        ],
        "idx" : NumberLong(1)
}
>
...