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

时间:2012-10-10 13:15:23

标签: mongodb string-concatenation

如何连接两个字段中的值并将其放入第三个字段中,值为字符串。 我试过这个:

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服务器上连接,而不是在我的应用程序中连接。

7 个答案:

答案 0 :(得分:14)

您可以使用aggregate,$ project和$ concat: https://docs.mongodb.org/v3.0/reference/operator/aggregation/project/ https://docs.mongodb.org/manual/reference/operator/aggregation/concat/

这将是这样的:

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

答案 1 :(得分:1)

假设你有一个集合名称是" myData"你有这样的数据的地方

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

并且您想要连接字段(first_name + last_name +地址)并将其保存到"地址"像这样的领域

{
"_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}});
    })
}

答案 2 :(得分:1)

**

在我看来,这个$concat为我工作了...

**

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

以@ rebe100x的答案为基础,如@Jamby所建议的...

您可以在聚合管道中使用$ 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将通过临时集合和重命名原子地执行集合替换。< / p>

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

答案 6 :(得分:-1)

db.myDB.find().forEach(function(e){db.myDB.update({"_id":e._id},{$set{"name":'More' + e.name + ' '}});

这是一个解决方案!!