MongoDB объединяет строки из двух полей в третье поле
Как объединить значения из двух полей и поместить в третье, значения являются строками. Я пробовал это:
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
,
Я хочу объединить только на сервере Монго, а не в моем приложении.
9 ответов
К сожалению, MongoDB в настоящее время не позволяет вам ссылаться на существующее значение какого-либо поля при выполнении обновления (). Существует существующий билет Jira для добавления этой функции: подробности см. На SERVER-1765.
В настоящее время вы должны выполнить начальный запрос, чтобы определить существующие значения и выполнить манипуляции со строками в клиенте. Хотел бы я иметь лучший ответ для вас.
Вы можете использовать агрегат, $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" ] } } }
]
)
Вы могли бы использовать $set
как это в версии 4.2, которая поддерживает конвейер агрегации в обновлении.
db.collection.update(
{"_id" :{"$exists":true}},
[{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)
Основываясь на ответе @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 будет атомарно выполнять замену коллекции через временную коллекцию и переименование.
https://docs.mongodb.com/manual/reference/operator/aggregation/merge/ https://docs.mongodb.com/manual/reference/operator/aggregation/merge/
**
в моем случае это
$concat
работал у меня...
**
db.collection.update( { "_id" : {"$exists":true} },
[ {
"$set" : {
"column_2" : { "$concat" : ["$column_4","$column_3"] }
}
}
]
Вы также можете следовать ниже.
db.collectionName.find({}).forEach(function(row) {
row.newField = row.field1 +"-" +row.field2
db.collection.save(row);
});
Давайте предположим, что у вас есть имя коллекции "myData", где у вас есть такие данные
{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"H-148, Near Hero Show Room, Shahjahanpur",
}
и вы хотите объединить поля (first_name+ last_name +address) и сохранить его в поле "address", как это
{
"_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}});
})
}
Найти и обновить каждый с помощью цикла For
Попробуй это:
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 } } ) });
db.myDB.find().forEach(function(e){db.myDB.update({"_id":e._id},{$set{"name":'More' + e.name + ' '}});
Это решение!!