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
.
Я хочу объединить только на сервере mongo, а не в моем приложении.
5 ответов
к сожалению, MongoDB в настоящее время не позволяет ссылаться на существующее значение любого поля при выполнении update(). Существует существующий билет Jira для добавления этой функции: см. сервер-1765 для сведения.
в настоящее время необходимо выполнить начальный запрос для определения существующих значений и выполнить манипуляцию строками в клиенте. Жаль, что у меня нет лучшего ответа.
вы можете использовать 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" ] } } }
]
)
предположим, что у вас есть имя коллекции "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}});
})
}
вы также можете следовать ниже.
db.collectionName.find({}).forEach(function(row) {
row.newField = row.field1 +"-" +row.field2
db.collection.save(row);
});
db.myDB.find().forEach(function(e){db.myDB.update({"_id":e._id},{$set{"name":'More' + e.name + ' '}});
это решение!!