Создать уникальный ObjectId во время $ project pipe - PullRequest
1 голос
/ 03 июля 2019

У меня есть запрос структуры агрегации, который суммирует определенные данные документа в поисковый набор.К сожалению, я не могу предоставить данные, поскольку они связаны с компанией.Вот запрос и фрагмент данных из последних этапов конвейера:

...
{ $group: { _id: "$SectionId", "Questions": { $addToSet: "$Questions" } } },
{ $unwind: "$Questions" },

, который возвращает такие данные: Обратите внимание, что _id не является уникальным.

{
    "_id" : "Tonometry",
    "Questions" : {
        "MappingId" : "Exophoria",
        "PositiveLabel" : "Positive",
        "NegativeLabel" : "Negative"
    }
},
{
    "_id" : "Tonometry",
    "Questions" : {
        "MappingId" : "Heterophoria",
        "PositiveLabel" : "Positive",
        "NegativeLabel" : "Negative"
    }
},

Следующий этап в конвейере:

{
    $project: {
        "_id": 1,
        "id": ObjectId(),
        "SectionId": "$_id",
        "MappingId": "$Questions.MappingId",
        "PositiveLabel": "$Questions.PositiveLabel",
        "NegativeLabel": "$Questions.NegativeLabel",
    }
},

, который выдает:

{
    "_id" : "Tonometry",
    "id" : ObjectId("5d1cf66cf526f23524f865c6"),
    "SectionId" : "Tonometry",
    "MappingId" : "Exophoria",
    "PositiveLabel" : "Positive",
    "NegativeLabel" : "Negative"
},
{
    "_id" : "Tonometry",
    "id" : ObjectId("5d1cf66cf526f23524f865c6"),
    "SectionId" : "Tonometry",
    "MappingId" : "Heterophoria",
    "PositiveLabel" : "Positive",
    "NegativeLabel" : "Negative"
},

Я попытался создать новое поле Id с уникальным ObjectId, но, к сожалению,просто повторно использует один и тот же ObjectId во всех узлах.Это важно, потому что когда я пытаюсь использовать $out, требуется уникальный _id.

Как добавить уникальный ObjectId для каждого узла?

1 Ответ

0 голосов
/ 03 июля 2019

Использование $out не требует уникального _id, вы можете использовать $replaceRoot вместе с $mergeObjects до конвейера $out, это объединит документ Question в нужный документ без поля _id и $out создаст для вас поле _id в новой коллекции:

[
    ....
    { "$group": { "_id": "$SectionId", "Questions": { "$addToSet": "$Questions" } } },
    { "$unwind": "$Questions" },
    { "$replaceRoot": { 
        "newRoot": { 
            "$mergeObjects": [ 
                { "Section": "$_id" }, 
                "$Questions" 
             ] 
        } 
    } },
    { "$out": "new-collection" }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...