如何连接两个字符串字段中的值并将其放入第三个字符串字段中?
我试过这个:
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 服务器上连接,而不是在我的应用程序中连接。
不幸的是,MongoDB 目前不允许您在执行 update() 时引用任何字段的现有值。有一个现有的 Jira 票证可以添加此功能:有关详细信息,请参阅SERVER-1765。
目前,您必须进行初始查询以确定现有值,并在客户端中进行字符串操作。我希望我能为您提供更好的答案。
$set
,它支持更新中的聚合管道。
db.collection.update(
{"_id" :{"$exists":true}},
[{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)
根据@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
就我而言,这**
$concat
对我有用......
db.collection.update( { "_id" : {"$exists":true} },
[ {
"$set" : {
"column_2" : { "$concat" : ["$column_4","$column_3"] }
}
}
]
{
"_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}});
})
}
db.collectionName.find({}).forEach(function(row) {
row.newField = row.field1 + "-" + row.field2
db.collectionName.save(row);
});
db.getCollection('users').find({ }).forEach( function(user) {
user.full_name = user.first_name + " " + user.last_name;
db.getCollection('users').save(user);
});
db.getCollection('users').find({ }).forEach( function(user) {
db.getCollection('users').update(
{ _id: user._id },
{ $set: { "full_name": user.first_name + " " + user.last_name } }
)
});
我发现如果你想要连接的字段之一为空,则整个结果也将为空(也不理想)