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.
В настоящее время вы должны выполнить первоначальный запрос, чтобы определить существующие значения и выполнить манипуляции с строкой в клиенте. Хотелось бы, чтобы у меня был лучший ответ для вас.
Ответ 2
Вы можете использовать агрегат, $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" ] } } }
]
)
Ответ 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 + ' '}});
Это решение!