MongoDB将两个字段中的字符串连接到第三个字段中

MongoDB将两个字段中的字符串连接到第三个字段中,mongodb,mongodb-query,aggregation-framework,string-concatenation,mongodb-update,Mongodb,Mongodb Query,Aggregation Framework,String Concatenation,Mongodb Update,如何连接两个字符串字段中的值并将其放入第三个字段中 我试过这个: db.collection.update( { "_id": { $exists: true } }, { $set: { column_2: { $add: ['$column_4', '$column_3'] } } }, false, true ) db.collection.update( { "_id": { $exists : true } }, { $set: { column_2: { $ad

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

我试过这个:

db.collection.update(
  { "_id": { $exists: true } },
  { $set: { column_2: { $add: ['$column_4', '$column_3'] } } },
  false, true
)
db.collection.update(
  { "_id": { $exists : true } },
  { $set: { column_2: { $add: ['a', 'b'] } } },
  false, true
)
但它似乎不起作用,并抛出存储不正常的

我也试过:

db.collection.update(
  { "_id": { $exists: true } },
  { $set: { column_2: { $add: ['$column_4', '$column_3'] } } },
  false, true
)
db.collection.update(
  { "_id": { $exists : true } },
  { $set: { column_2: { $add: ['a', 'b'] } } },
  false, true
)
但即使这样,存储也会显示相同的错误
不正常


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

不幸的是,MongoDB当前不允许您在执行更新()时引用任何字段的现有值。现有Jira票证可添加此功能:有关详细信息,请参阅


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

您可以使用聚合运算符和:


您也可以按照以下步骤操作

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

假设集合名为“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}});
    })
}
您可以在4.2中这样使用,它支持更新中的聚合管道

db.collection.update(
   {"_id" :{"$exists":true}},
   [{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)
根据@rebe100x的答案,正如@Jamby建议的那样

您可以在聚合管道中使用$project、$concat和$out(或$merge)。

例如:

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

使用MongoDB 4.2

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

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

您应该考虑性能、并发性和一致性之间的权衡,当选择$合并和$OUT时,因为$OUT将<强>原子通过临时集合和重命名来执行集合替换< /强>。

**

在我的情况下,
$concat
对我有效

**


看到了吗?forEach效率很低,我正在寻找多个更新。此外,它也没有解释如何用连接字符串更新另一个字段的值,这就是我要寻找的
col3=col1+col2
“+”意味着连接MongoDB不允许在不使用JS函数的情况下在查询中重新影响它自己的文档字段。我强烈建议不要使用JS函数,因为它们已经被证明会使查询速度降低10倍,并且还存在其他问题。你需要找到一些创造性的方法来解决这个问题。对于普通的字符串连接,你不需要$add op,因为它不像SQL,相反,你可以只做
column_2:'a'+'b'
正确的答案应该包括$out作为最后一个管道阶段,在同一个集合(或新的集合)中输出,由于OP希望更新collectionMongoDB 4.2,因此现在有一个$merge pipeline阶段,它比$out有一些优势,这取决于您的性能、并发性和一致性要求。如果使用新的连接字段更新现有文档,上述聚合会是什么样子?仅供参考(7年后)MongoDB有多种方法可以实现这一点,而无需客户端代码。这是2012年最好的答案,但威廉·Z希望得到更好答案的愿望已经实现了。:)