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 + ' '}});

это решение!!