Используйте toString () в проекции Mongodb - PullRequest
0 голосов
/ 29 мая 2018

Я не уверен, является ли это проблемой MongoDB, с которой я сталкиваюсь, или одним из инструментов (NoSQLBooster, Studio 3T).Я могу использовать следующий код в NoSQLBooster, и он работает.Но Studio 3T жалуется на неверный JSON.Я думаю, что я предпочитаю студию 3T, так как в ней гораздо больше функций, есть ли обходной путь, чтобы сделать этот валидный JSON?У него есть проблема с частями .toString () проекции, говоря «недопустимый JSON» (хотя это будет работать в NoSQLBooster).

$project:
    {
        _id: 0,
        "Country": "$country",
        "Zip From": {
            $cond: {
                if: { "$lt": [{ "$strLenCP": "$postcodeFrom" }, 4] },
                then: { $concat: ["0", "$postcodeFrom".toString()] },
                else: "$postcodeFrom".toString()
            }
        },
        "FRPUW": "0",
        "Estimated Delivery (days)": "$rate.serviceDeliveryDays"
    }

1 Ответ

0 голосов
/ 29 мая 2018

Здесь вы можете использовать $substr или $substrBytes или $substrCP в современных версиях.Первый считается устаревшим в новых выпусках и имеет псевдоним $substrBytes.Долгое время он превращал целое / двойное число в строку:

 { "$project": {
   "_id": 0,
   "Country": "$country",
   "Zip From": {
      "$cond": {
        "if": { "$lt": [{ "$strLenCP": { "$substr": ["$postcodeFrom",0,10] } }, 4] },
        "then": { "$concat": ["0", { "$substr": ["$postcodeFrom",0,10] }] },
        "else": { "$substr": ["$postcodeFrom", 0, 10 ] }
      }
   },
   "FRPUW": "0",
   "Estimated Delivery (days)": "$rate.serviceDeliveryDays"
 }}

В MongoDB 4.0 вы можете использовать псевдоним $toString для $convert вместо:

 { "$project": {
   "_id": 0,
   "Country": "$country",
   "Zip From": {
      "$cond": {
        "if": { "$lt": [{ "$strLenCP": { "$toString": "$postcodeFrom" } }, 4] },
        "then": { "$concat": ["0", { "$toString": "$postcodeFrom",0,10] }] },
        "else": { "$toString": "$postcodeFrom" }
      }
   },
   "FRPUW": "0",
   "Estimated Delivery (days)": "$rate.serviceDeliveryDays"
 }}

Единственный «улов» с $substr и его вариантами является то, что вам нужно включить максимальную длину строки в качестве третьего аргумента.Это может быть просто любое число, превышающее ожидаемую длину полученной строки.Здесь я использую 10 в качестве разумной длины, но если вы ожидаете большего результата, увеличьте число.

Единственная реальная вещь, о которой следует знать, это то, что использование $substr будетне работает для других типов.Более «формализованным» методом является $toString, который охватывает большинство случаев для всех «типов».Фактический формальный $convert действительно предназначен для случаев, когда ожидаемое «приведение типа» может потерпеть неудачу, а затем позволяет «обработчику ошибок» вернуться к возвращению значения по умолчанию или другого «допустимого» выражения.

Более того, поскольку «выражения агрегации», операторы для них «допустимы» для любого языка реализации, а не только для JavaScipt, который вопреки основным заблуждениям вообще не является формальным языком MongoDB, кроме как в рамках специализированных задачоценка сервера, которая постепенно устаревает и в любом случае удаляется.

ПРИМЕЧАНИЕ - В вопросе, где вы цитируете "допустимый JSON", есть небольшой "неправильный термин".Это на самом деле не о JSON, а о том, что структура агрегирования понимает только «допустимые выражения» , а не «выражения JavaScript», которые вы пытаетесь использовать.

Вопреки распространенному заблуждениюкогда вы видите другой код, который включает в себя «выражение JavaScript» в содержимом конвейера агрегации, этот код фактически не «выполняется на сервере».На самом деле происходит вычисление выражения «локально», затем результат переводится в BSON, а «это» - то, что выполняется на сервере.

Короче говоря, вы не можете передать «выражение поля BSON»в «функцию JavaScript» или другое локальное выражение, потому что это не то, что на самом деле происходит при оценке оператора.

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