在Mongodb投影中使用toString()

时间:2018-05-29 00:31:13

标签: mongodb studio3t

我不确定这是否是我面临的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 :(得分: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函数”或其他本地表达式,因为这不是评估语句时实际发生的情况。