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.

Я хочу объединить только на сервере Монго, а не в моем приложении.

Ответ 1

К сожалению, MongoDB в настоящее время не позволяет ссылаться на существующее значение любого поля при выполнении обновления(). Для добавления этой функции существует существующий билет Jira. Подробнее см. SERVER-1765.

В настоящее время вы должны выполнить первоначальный запрос, чтобы определить существующие значения и выполнить манипуляции с строкой в ​​клиенте. Хотелось бы, чтобы у меня был лучший ответ для вас.

Ответ 3

предположим, что у вас есть имя коллекции - "myData", где у вас есть данные, подобные этому

{
"_id":"xvradt5gtg",
"first_name":"nizam",
"last_name":"khan",
"address":"H-148, Near Hero Show Room, Shahjahanpur",
}

и вы хотите объединить поля (first_name + last_name + 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}});
    })
}

Ответ 4

Вы также можете следовать ниже.

db.collectionName.find({}).forEach(function(row) { 
    row.newField = row.field1 + "-" + row.field2
    db.collectionName.save(row);
});

Ответ 5

Вы можете использовать $set как это в 4.2, которая поддерживает конвейер агрегации в обновлении.

db.collection.update(
   {"_id" :{"$exists":true}},
   [{"$set":{"column_2":{"$concat":["$column_4","$column_3"]}}}]
)

Ответ 6

Основываясь на ответе от @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/#merge-out-comparison

Ответ 7

db.myDB.find().forEach(function(e){db.myDB.update({"_id":e._id},{$set{"name":'More' + e.name + ' '}});

Это решение!