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

  1. Попробуй это:

            db.getCollection('users').find({ }).forEach( function(user) {
        user.full_name = user.first_name + " " + user.last_name;
        db.getCollection('users').save(user);
    });
    
  2. Или попробуйте это:

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

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

Другие вопросы по тегам