Извлекать отдельные значения из вложенного массива Mongo DB и выводить в один массив - PullRequest
3 голосов
/ 10 апреля 2019

, приведенное ниже, это мои данные в mongo db. Я хочу получить все уникальные идентификаторы из полевых статей, которые вложены в индекс jnlc_subjects. Результат должен содержать только массив статей с различными идентификаторами объектов.

Mongo Data

{
"_id" : ObjectId("5c9216f1a21a4a31e0c7fa56"),
"jnlc_journal_category" : "Biology",
"jnlc_subjects" : [ 
    {
        "subject" : "Conservation Biology",
        "views" : "123",
        "articles" : [ 
            ObjectId("5c4e93d0135edb6812200d5f"), 
            ObjectId("5c4e9365135edb6a12200d60"), 
            ObjectId("5c4e93a8135edb6912200d61")
        ]
    }, 
    {
        "subject" : "Micro Biology",
        "views" : "20",
        "articles" : [ 
            ObjectId("5c4e9365135edb6a12200d60"), 
            ObjectId("5c4e93d0135edb6812200d5f"), 
            ObjectId("5c76323fbaaccf5e0bae7600"), 
            ObjectId("5ca33ce19d677bf780fc4995")
        ]
    }, 
    {
        "subject" : "Marine Biology",
        "views" : "8",
        "articles" : [ 
            ObjectId("5c4e93d0135edb6812200d5f")
        ]
    }
]
}

Требуемый результат
Я хочу получить вывод в следующем формате

articles : [ 
            ObjectId("5c4e9365135edb6a12200d60"), 
            ObjectId("5c4e93a8135edb6912200d61"),
            ObjectId("5c76323fbaaccf5e0bae7600"), 
            ObjectId("5ca33ce19d677bf780fc4995"),
            ObjectId("5c4e93d0135edb6812200d5f")
        ]

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Попробуйте как показано ниже:

db.collection.aggregate([
        {
            $unwind: "$jnlc_subjects"
        },
        {
            $unwind: "$jnlc_subjects.articles"
        },
        { $group: {_id: null, uniqueValues: { $addToSet: "$jnlc_subjects.articles"}} }
    ])

Результат:

{
    "_id" : null,
    "uniqueValues" : [
        ObjectId("5ca33ce19d677bf780fc4995"),
        ObjectId("5c4e9365135edb6a12200d60"),
        ObjectId("5c4e93a8135edb6912200d61"),
        ObjectId("5c4e93d0135edb6812200d5f"),
        ObjectId("5c76323fbaaccf5e0bae7600")
    ]
}
1 голос
/ 10 апреля 2019

В соответствии с описанием, как упомянуто в вышеупомянутом вопросе, пожалуйста, попробуйте выполнить следующую агрегатную операцию.

db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                "_id": ObjectId("5c9216f1a21a4a31e0c7fa56")
            }
        },

        // Stage 2
        {
            $unwind: {
                path: "$jnlc_subjects",
            }
        },

        // Stage 3
        {
            $unwind: {
                path: "$jnlc_subjects.articles"

            }
        },

        // Stage 4
        {
            $group: {
                _id: null,
                articles: {
                    $addToSet: '$jnlc_subjects.articles'
                }
            }
        },

        // Stage 5
        {
            $project: {
                articles: 1,
                _id: 0
            }
        },

    ]



);
1 голос
/ 10 апреля 2019

Попробуйте с этим

db.collection.aggregate([
{
$unwind:{
 path:"$jnlc_subjects",
 preserveNullAndEmptyArrays:true
 }   
},
{
$unwind:{
 path:"$jnlc_subjects.articles",
 preserveNullAndEmptyArrays:true
 }   
},
{
$group:{
    _id:"$_id",
    articles:{
        $addToSet:"$jnlc_subjects.articles"
        }
    }
}
])

Если вы не хотите $group с _id, вы можете использовать null вместо $_id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...