【问题标题】:MongoDB concatenate strings from two fields into a third fieldMongoDB 将两个字段中的字符串连接到第三个字段中
【发布时间】:2012-09-30 23:28:18
【问题描述】:

如何连接两个字符串字段中的值并将其放入第三个字段?

我试过了:

db.collection.update(
  { "_id": { $exists: true } },
  { $set: { column_2: { $add: ['$column_4', '$column_3'] } } },
  false, true
)

这似乎不起作用,并抛出not ok for storage

我也试过这个:

db.collection.update(
  { "_id": { $exists : true } },
  { $set: { column_2: { $add: ['a', 'b'] } } },
  false, true
)

但即使这样也显示相同的错误not ok for storage

我只想在 mongo 服务器上而不是在我的应用程序中连接。

【问题讨论】:

  • 见 stackoverflow.com/questions/4110897/mongodb-concatenate-results>?
  • forEach 效率低下,我正在寻找多重更新。也没有解释,如何用连接的字符串更新另一个字段的值,这就是我正在寻找的col3 = col1 + col2“+”暗示连接
  • Mongodb 不允许在不使用 JS 函数的情况下在查询中反映它自己的文档字段。我强烈建议不要使用 JS 函数,因为它们已被证明会使查询慢 10 倍并且还有其他问题。你需要找到一些创造性的方法来解决这个问题
  • 对于普通的字符串连接,你不需要 $add 操作,因为它不像 SQL,而是你可以做column_2:'a'+'b'

标签: mongodb mongodb-query aggregation-framework string-concatenation mongodb-update


【解决方案1】:

您可以使用聚合运算符$project$concat

db.collection.aggregate([
  { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } }
])

【讨论】:

  • 正确的答案将包括 $out 作为最后一个管道阶段,输出到同一个集合(或一个新集合)中,因为 OP 想要更新集合
  • MongoDB 4.2 现在有一个 $merge 管道阶段,它比 $out 有一些优势,具体取决于您的性能、并发性和一致性要求。
  • 如果使用新的连接字段更新现有文档的步骤,上述聚合会是什么样子?
【解决方案2】:

不幸的是,MongoDB 目前不允许您在执行 update() 时引用任何字段的现有值。有一个现有的 Jira 票可以添加此功能:有关详细信息,请参阅 SERVER-1765

目前,您必须执行初始查询以确定现有值,并在客户端执行字符串操作。我希望我能给你一个更好的答案。

【讨论】:

  • 仅供参考(7 年后)MongoDB 有多种方法可以在没有客户端代码的情况下完成此任务。这 2012 年的最佳答案,但William Z 希望得到更好答案的愿望已经实现。 :)
【解决方案3】:

您可以在 4.2 中像这样使用$set,它支持更新中的聚合管道。

db.collection.update(
   {"_id" :{"$exists":true}},
   [{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)

【讨论】:

    【解决方案4】:

    **

    在我的情况下,$concat 为我工作......

    **

    db.collection.update( { "_id" : {"$exists":true} }, 
       [ { 
           "$set" : { 
                     "column_2" :  { "$concat" : ["$column_4","$column_3"] }
                    }
          }
       ]
    

    【讨论】:

      【解决方案5】:

      假设您有一个集合名称是“myData”,其中您有这样的数据

      {
      "_id":"xvradt5gtg",
      "first_name":"nizam",
      "last_name":"khan",
      "address":"H-148, Near Hero Show Room, Shahjahanpur",
      }
      

      并且您想要连接字段(名字+姓氏+地址)并将其保存到这样的“地址”字段中

      {
      "_id":"xvradt5gtg",
      "first_name":"nizam",
      "last_name":"khan",
      "address":"nizam khan,H-148, Near Hero Show Room, Shahjahanpur",
      }
      

      现在写查询将是

      {
      var x=db.myData.find({_id:"xvradt5gtg"});
      x.forEach(function(d)
          { 
              var first_name=d.first_name;
              var last_name=d.last_name;
              var _add=d.address;  
              var fullAddress=first_name+","+last_name+","+_add; 
              //you can print also
              print(fullAddress); 
              //update 
              db.myData.update({_id:d._id},{$set:{address:fullAddress}});
          })
      }
      

      【讨论】:

        【解决方案6】:

        您也可以按照以下方式进行操作。

        db.collectionName.find({}).forEach(function(row) { 
            row.newField = row.field1 + "-" + row.field2
            db.collectionName.save(row);
        });
        

        【讨论】:

          【解决方案7】:

          根据@Jamby 的建议,基于@rebe100x 的答案...

          您可以在聚合管道中使用 $project、$concat 和 $out(或 $merge)。 https://docs.mongodb.org/v3.0/reference/operator/aggregation/project/ https://docs.mongodb.org/manual/reference/operator/aggregation/concat/ https://docs.mongodb.com/manual/reference/operator/aggregation/out/

          例如:

              db.collection.aggregate(
                 [
                    { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
                    { $out: "collection" }
                 ]
              )
          
          

          使用 MongoDB 4.2。 . .

          MongoDB 4.2 添加了 $merge 管道阶段,该阶段提供 选择性替换集合中的文档,而 $out 将 替换整个集合。您还可以选择合并而不是替换目标文档。

              db.collection.aggregate(
                 [
                    { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } },
                    { $merge: { into: "collection", on: "_id", whenMatched: "merge", whenNotMatched: "discard" }
                 ]
              )
          

          在 $merge 和 $out 之间进行选择时,您应该考虑性能、并发性和一致性之间的权衡,因为 $out 将通过临时集合和重命名自动执行集合替换

          https://docs.mongodb.com/manual/reference/operator/aggregation/merge/ https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#merge-out-comparison

          【讨论】:

            猜你喜欢
            • 2015-05-07
            • 1970-01-01
            • 2020-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多