Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数组中的字符串值连接到MongoDB中的单个字段中_Javascript_Mongodb_Mapreduce_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 将数组中的字符串值连接到MongoDB中的单个字段中

Javascript 将数组中的字符串值连接到MongoDB中的单个字段中,javascript,mongodb,mapreduce,mongodb-query,aggregation-framework,Javascript,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,假设我有一系列具有以下格式的文档: { "_id": "3_0", "values": ["1", "2"] } 我想得到数组值在单个字段中的投影: { "_id": "3_0", "values": "1_2" } 这可能吗?我尝试过$concat,但我想我不能在现代MongoDB版本中使用$values作为$concat的数组。您仍然无法“直接”将数组应用于$concat,但是您可以使用来处理数组元素并生成以下内容: db.collection.aggre

假设我有一系列具有以下格式的文档:

{
    "_id": "3_0",
    "values": ["1", "2"]
}
我想得到数组值在单个字段中的投影:

{
    "_id": "3_0",
    "values": "1_2"
}

这可能吗?我尝试过
$concat
,但我想我不能在现代MongoDB版本中使用
$values
作为
$concat

的数组。您仍然无法“直接”将数组应用于
$concat
,但是您可以使用来处理数组元素并生成以下内容:

db.collection.aggregate([
{“$addFields”:{
“价值”:{
“$reduce”:{
“输入”:“$values”,
“initialValue”:“,
“在”:{
“$cond”:{
“if”:{“$eq”:[{“$indexOfArray”:[“$values”,“$$this”]},0]},
“then”:{“$concat”:[“$$value”,“$$this”]},
“else”:{“$concat”:[“$$value”、“”、“$$this”]}
}    
}
}        
}
}}
])
当然,当下划线是数组的“第一个”索引时,为了而不是而将其与“\u”下划线“连接”

另外,我的额外“愿望”已得到
$sum
的答复:

db.collection.aggregate([
{“$addFields”:{
“总计”:{“$sum”:“$items.value”}
}}
])

通常,使用接受一个项目数组的聚合运算符会稍微提高这类问题。这里的区别在于,它表示在编码表示a中提供的“aguments”的“array”,与当前文档中的“array element”相对

在文档中存在的数组中真正实现项的串联的唯一方法是执行某种JavaScript选项,如中的示例所示:

db.collection.mapReduce(
函数(){
emit(this.u id,{“values”:this.values.join(“{”)});
},
函数(){},
{“out”:{“inline”:1}
)
当然,如果您实际上没有聚合任何内容,那么最好的方法可能是在查询结果的后处理过程中,在客户机代码中简单地执行“join”操作。但是,如果需要在文档中使用它,那么mapReduce将是唯一可以使用它的地方


我可以加上一句“例如”,我希望这样的东西能起作用:

{
“项目”:[
{“产品”:“A”,“值”:1},
{“乘积”:“B”,“值”:2},
{“产品”:“C”,“价值”:3}
]
}
总的来说:

db.collection.aggregate([
{“$project”:{
“总计”:{“$add”:[
{“$map”:{
“输入”:“$items”,
“作为”:“我”,
“in”:“$$i.value”
}}
]}
}}
])
但它不是这样工作的,因为它需要参数,而不是文档中的数组。唉(“按设计”推理的一部分可以认为,“仅仅因为”它是从转换结果传入的奇异值的数组或“列表”,所以不能“保证”这些值实际上是运算符期望的“有效”奇异数值类型值。至少在当前实现的“类型检查”

这意味着目前我们还必须这样做:

db.collection.aggregate([
{“$unwind”:“$items”},
{“$组”:{
“\u id”:“$\u id”,
“总计”:{“$sum”:“$items.value”}
}}
])
遗憾的是,也没有办法应用这样的分组运算符来连接字符串

因此,您可以希望对此进行某种更改,或者希望进行某种更改,以允许外部作用域变量在操作范围内以某种方式进行更改。更好的是,也欢迎使用新的
$join
操作。但这些操作在编写时并不存在,并且可能在未来一段时间内不会存在。

您可以告诉我们将操作员与操作员一起更换

db.collection.aggregate([
{
    $project: {
        values: {
            $reduce: {
              input: '$values',
              initialValue: '',
              in: {
                $concat: ['$$value', '_', '$$this']
              }
            }
        }   
    }       
},
{
    $project: {
        values: { $substr: ['$values', 1 , -1]}
    }       
}])

Mongo4.4
开始,聚合操作符允许应用自定义javascript函数来实现MongoDB查询语言不支持的行为

例如,为了连接字符串数组:

// { "_id" : "3_0", "values" : [ "1", "2" ] }
db.collection.aggregate(
  { $set:
    { "values":
      { $function: {
          body: function(values) { return values.join('_'); },
          args: ["$values"],
          lang: "js"
      }}
    }
  }
)
// { "_id" : "3_0", "values" : "1_2" }
$function
采用3个参数:

  • body
    ,它是要应用的函数,其参数是要加入的数组
  • args
    ,它包含
    函数体
    作为参数的记录中的字段。在本例中,
    “$values”
  • lang
    ,这是编写
    body
    函数的语言。当前只有
    js
    可用

感谢您的回答和示例。就像我认为这个问题没有简单的解决方案一样……我想我最终会找到另一个mapReduce,但我试图避免它,因为我已经使用了以前的mapReduce来生成该数据。您知道是否有某种方法可以将nodeJS中的mapReduce操作与MongoDB驱动程序链接起来“Eylen不是真的,意思是不输出到一个集合并再次运行它。否则就不可能。但是,如果你考虑你在最初的MapReduce操作中所做的事情,那么随后的步骤可能就不必要了。当然,总是有一个最终的决定。“方法。这似乎是合乎逻辑的结论,除非连接后需要进一步的“分组”。是的,我需要进行另一个与第一个完全不同的分组。我会再考虑一下,看看是否可以采取任何其他方法。谢谢您的帮助