Здесь вы можете использовать $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» или другое локальное выражение, потому что это не то, что на самом деле происходит при оценке оператора.