Агрегационный конвейер mongodb для создания списка значений из нескольких вложенных свойств документа - PullRequest
1 голос
/ 16 марта 2020

У меня есть две коллекции, db.items и db.data, в следующем формате:

// db.items document (configuration-level information such as name, settings, user, etc.)
{
    _id: #id,
    ...
}

// db.data document (data for the a configuration)
{
    ...,
    item: #id, // reference to _id of db.item doc
    grouping_1: [
        { name: "A", item: "ObjectId()" },
        { name: "B", item: "ObjectId()" }
    ],
    grouping_2: [
        { name: "C", item: "ObjectId()" },
        { name: "D", item: "ObjectId()" }
    ]
}

Похоже, я не могу понять, как использовать Агрегационный конвейер для подачи в db.item выполните c список реквизитов db.data "name".

// db.items document desired result
{
    _id: #id,
    names: ["A", "B", "C", "D"],
    ...
}

Запросы, такие как db.data.find( { item: #id }, { _id: 0, "grouping_1.name": 1, "grouping_2.name": 1 } ), по некоторым причинам возвращают наборы, подобные этому { "grouping_1": [ { "name": "A" }, { "name": "B" } ], "grouping_2" : [ { "name": "C" }, { "name", "D" } ] }

Я бы предпочел видеть реализацию с использованием как оболочки, так и драйвера C# (2.10); однако, если вы можете предоставить только один / это слишком много, чтобы попросить, я с радостью приму любой из них.

Редактировать: я думал, что реструктуризация моей схемы, чтобы быть чем-то вроде этого, возможно, имеет больше смысла / с ним проще работать.

{
    ...,
    grouping_1: {
        "A": "ObjectId()",
        "B": "ObjectId()"
    },
    grouping_2: {
        "C": "ObjectId()",
        "D": "ObjectId()"
    }
}

Редактировать 2: Для тех, у кого есть схема, подобная той, которую я предложил в первом редактировании, вот решение !

1 Ответ

1 голос
/ 16 марта 2020

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

db.Item.aggregate([
    {
        $match: {
            _id: ObjectId("5e6f98e41b70ea2c14c208b9")
        }
    },
    {
        $lookup: {
            from: "Data",
            localField: "_id",
            foreignField: "item",
            as: "data"
        }
    },
    {
        $project: {
            names: {
                $map: {
                    input: {
                        $concatArrays: [
                            { $arrayElemAt: ["$data.grouping_1", 0] },
                            { $arrayElemAt: ["$data.grouping_2", 0] }]
                    },
                    in: '$$this.name'
                }
            }
        }
    }
])

https://mongoplayground.net/p/H3Q3N0-P9JB

вот хороший способ выполнить этот трубопровод в c#

...