Агрегат $ lookup не возвращает элементам оригинальный порядок массива

Для настраиваемого формата для каждого столбца вы можете установить формат для всей строки. fmt param обеспечивает форматирование для каждой строки

with open('output.dat') as ofile:
     fmt = '%.0f %02.0f %4.1f %3.0f %4.0f %4.1f %4.0f %4.1f %4.0f'
     np.savetxt(ofile, df.values, fmt=fmt)
1
задан Neil Lunn 7 March 2019 в 00:22
поделиться

1 ответ

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "let": { "classIds": "$Classes.ID" },
    "pipeline": [
      { "$match": {
        "$expr": { "$in": [ "

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

[110]

Или унаследованным [117 ] использование:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "localField": "Classes.ID",
    "foreignField": "_id",
    "as": "results"
  }},
  { "$unwind": "$results" },
  { "$addFields": {
    "sort": {
      "$indexOfArray": [ "$Classes.ID", "$results._id" ]
    }
  }},
  { "$sort": { "_id": 1, "sort": 1 } },
  { "$group": {
    "_id": "

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

[110]

Или унаследованным [117 ] использование:

[111]

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

id", "Name": { "$first": "$Name" }, "Classes": { "$first": "$Classes" }, "results": { "$push": "$results" } }} ])

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

id", "$classIds" ] } }}, { "$addFields": { "sort": { "$indexOfArray": [ "$classIds", "

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

[110]

Или унаследованным [117 ] использование:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "localField": "Classes.ID",
    "foreignField": "_id",
    "as": "results"
  }},
  { "$unwind": "$results" },
  { "$addFields": {
    "sort": {
      "$indexOfArray": [ "$Classes.ID", "$results._id" ]
    }
  }},
  { "$sort": { "_id": 1, "sort": 1 } },
  { "$group": {
    "_id": "

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

[110]

Или унаследованным [117 ] использование:

[111]

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

id", "Name": { "$first": "$Name" }, "Classes": { "$first": "$Classes" }, "results": { "$push": "$results" } }} ])

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

id" ] } }}, { "$sort": { "sort": 1 } }, { "$addFields": { "sort": "$REMOVE" }} ], "as": "results" }} ])

Или унаследованным [117 ] использование:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "localField": "Classes.ID",
    "foreignField": "_id",
    "as": "results"
  }},
  { "$unwind": "$results" },
  { "$addFields": {
    "sort": {
      "$indexOfArray": [ "$Classes.ID", "$results._id" ]
    }
  }},
  { "$sort": { "_id": 1, "sort": 1 } },
  { "$group": {
    "_id": "

Это «по замыслу» реализации $lookup . То, что на самом деле происходит «под капотом» , это MongoDB internall преобразует аргументы в $lookup в новый выразительный формат с использованием $expr и $in . Даже в версиях, предшествовавших тому, когда была реализована эта выразительная форма , внутренняя механика для «массива значений» была действительно такой же.

Решение здесь состоит в том, чтобы сохранить копию исходного массива в качестве ссылки для переупорядочения «соединенных» элементов:

[110]

Или унаследованным [117 ] использование:

[111]

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

id", "Name": { "$first": "$Name" }, "Classes": { "$first": "$Classes" }, "results": { "$push": "$results" } }} ])

Оба варианта дают одинаковый результат:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

Общая концепция заключается в использовании $indexOfArray по сравнению с _id значение из «присоединенного» содержимого , чтобы найти его «индексную» позицию в исходном массиве источника из "$Classes.ID". Различные варианты синтаксиса $lookup имеют разные подходы к тому, как вы получаете доступ к этой копии и как вы в основном восстанавливаете.

$sort , конечно, устанавливает порядок фактических документов, либо внутри конвейерной обработки для выразительной формы, либо через открытые документы $unwind ] . Там, где вы использовали $unwind , вы затем $group вернулись к исходной форме документа.

ПРИМЕЧАНИЕ : Примеры использования здесь зависят от MongoDB 3.4 для $indexOfArray как минимум, а $REMOVE совпадает с MongoDB 3.6 как было бы выразительным $lookup.

Существуют и другие подходы к переупорядочению массива для предыдущих выпусков, но они более подробно продемонстрированы на Гарантирует ли MongoDB порядок $ in в предложении . Реально минимум, который вы должны сейчас использовать в качестве рабочей версии MongoDB, - это версия 3.4.

См. Политика поддержки в разделе Сервер MongoDB для получения полной информации о поддерживаемых выпусках и датах окончания.

0
ответ дан Neil Lunn 7 March 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: