23

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

我试过这个:

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

4

7 回答 7

30

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

db.collection.aggregate([
  { $project: { newfield: { $concat: [ "$field1", " - ", "$field2" ] } } }
])
于 2016-01-21T21:24:31.923 回答
10

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

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

于 2012-10-10T21:48:59.210 回答
4

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

db.collection.update(
   {"_id" :{"$exists":true}},
   [{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)
于 2019-10-04T01:10:01.747 回答
2

**

就我而言,这$concat对我有用...

**

db.collection.update( { "_id" : {"$exists":true} }, 
   [ { 
       "$set" : { 
                 "column_2" :  { "$concat" : ["$column_4","$column_3"] }
                }
      }
   ]
于 2020-01-29T04:48:13.903 回答
1

您也可以按照以下说明进行操作。

db.collectionName.find({}).forEach(function(row) { 
    row.newField = row.field1 + "-" + row.field2
    db.collectionName.save(row);
});
于 2017-09-18T03:13:38.610 回答
1

假设您有一个集合名称是“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}});
    })
}
于 2018-02-28T10:47:32.363 回答
1

根据@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

于 2019-10-10T21:35:36.083 回答