Группировать по элементу массива в Mongodb - PullRequest
1 голос
/ 22 апреля 2019

Мы вложили документ и пытаемся сгруппировать его по элементу массива.Наша структура документа выглядит как

/* 1 */
{
    "_id" : ObjectId("5a690a4287e0e50010af1432"),
    "slug" : [ 
        "true-crime-the-10-most-infamous-american-murder-mysteries", 
        "10-most-infamous-american-murder-mysteries"
    ],
    "tags" : [ 
        {
            "id" : "59244aa6b1be5055278e9b5b",
            "name" : "true crime",
            "_id" : "59244aa6b1be5055278e9b5b"
        }, 
        {
            "id" : "5924524db1be5055278ebd6e",
            "name" : "Occult Museum",
            "_id" : "5924524db1be5055278ebd6e"
        }, 
        {
            "id" : "5a690f0fc1a72100110c2656",
            "_id" : "5a690f0fc1a72100110c2656",
            "name" : "murder mysteries"
        }, 
        {
            "id" : "59244d71b1be5055278ea654",
            "name" : "unsolved murders",
            "_id" : "59244d71b1be5055278ea654"
        }
    ]
}

Мы хотим найти список всех групп слагов по имени тега.Я пытаюсь следовать, и это дает результат, но это не точно.У нас есть сотни записей с каждым тегом, но я получаю только несколько с моим запросом.Я не уверен, что я делаю не так здесь.Заранее спасибо.

// Requires official MongoShell 3.6+

db.getCollection("test").aggregate(
    [
        { 
            "$match" : {
                "item_type" : "Post", 
                "site_id" : NumberLong(2), 
                "status" : NumberLong(1)
            }
        },
		{$unwind: "$tags" },         
        { 
            "$group" : {
                "_id" : {
                    "tags᎐name" : "$tags.name",
                    "slug" : "$slug"
                }
            }
        }, 
        { 
            "$project" : {
                "tags.name" : "$_id.tags᎐name",
                "slug" : "$_id.slug",
                "_id" : NumberInt(0)
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

Ожидаемый результат -

TagName     Slug
----------
true crime "true-crime-the-10-most-infamous-american-murder-mysteries", 
           "10-most-infamous-american-murder-mysteries"
           "All records where tags true crime"

1 Ответ

1 голос
/ 22 апреля 2019

Вместо использования slug как части _id вы должны использовать $ push или $ addToSet для их накопления, попробуйте:

db.test.aggregate([
    {
        $unwind: "$tags"
    },
    {
        $unwind: "$slug"
    },
    {
        $group: {
            _id: "$tags.name",
            slugs: { $addToSet: "$slug" }
        }
    },
    {
        $project: {
            _id: 1,
            slugs: {
                $reduce: {
                    input: "$slugs",
                    initialValue: "",
                    in: {
                        $concat: [ "$$value", ",", "$$this" ]
                    }
                }
            }
        }
    }
])

РЕДАКТИРОВАТЬ: чтобы получить строку для слагов, разделенных запятыми, вы можете использовать $ уменьшать с $ concat

Выход:

{ "_id" : "murder mysteries", "slugs" : ",10-most-infamous-american-murder-mysteries,true-crime-the-10-most-infamous-american-murder-mysteries" }
{ "_id" : "Occult Museum", "slugs" : ",10-most-infamous-american-murder-mysteries,true-crime-the-10-most-infamous-american-murder-mysteries" }
{ "_id" : "unsolved murders", "slugs" : ",10-most-infamous-american-murder-mysteries,true-crime-the-10-most-infamous-american-murder-mysteries" }
{ "_id" : "true crime", "slugs" : ",10-most-infamous-american-murder- mysteries,true-crime-the-10-most-infamous-american-murder-mysteries" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...