我不确定这是否是我面临的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"
}
答案 0 :(得分:2)
现代版本中您可以使用$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,而是聚合框架只能理解"valid expressions"而不是您尝试使用的“JavaScript表达式”这一事实。
与常见的误解相反,当您在聚合管道的内容中看到包含“JavaScript表达式”的其他代码时,此代码实际上并不“在服务器上执行”。实际发生的是表达式被“本地”评估,然后结果被转换为BSON,“那”是在服务器上执行的。
简而言之,你不能将“BSON字段表达式”传递给“JavaScript函数”或其他本地表达式,因为这不是评估语句时实际发生的情况。