#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Я новичок в mongodb и хотел преобразовать свой массив в объект с помощью конвейера. Например,
{
field1: [1,2,3,4,5],
field2: [‘a’,’b’,’c’,’d’,’e’],
}
Я хочу, чтобы приведенный выше документ был преобразован в,
{
fields: [
{
field1: 1,
field2: ‘a’
},
......
{
field1: 5,
field2: ‘e’
}
]
}
Есть идеи, как я могу этого добиться?
Ответ №1:
Вы можете использовать $unwind для разделения ваших массивов.
А затем отформатируйте свой новый список с $project
помощью, не забыв удалить дубликаты, созданные $unwind
.
db.collection.aggregate({
"$unwind": {
path: "$field1",
includeArrayIndex: "field1_index"
}
},
{
"$unwind": {
"path": "$field2",
"includeArrayIndex": "field2_index"
}
},
{
"$project": {
"fields": {
"field1": "$field1",
"field2": "$field2"
},
"diff": {
$cmp: [
"$field1_index",
"$field2_index"
]
}
}
},
{
"$match": {
"diff": 0
}
},
{
$group: {
_id: "$_id",
fields: {
$push: "$fields"
}
}
})
Попробуйте здесь
Ответ №2:
Для достижения этой цели вы можете использовать $ zip, $ map и $ reduce:
db.collection.aggregate([
{
"$addFields": {
fields: {
$reduce: {
input: {
$zip: {
inputs: [
{
$map: {
input: "$field1",
as: "f1",
in: {
field1: "$$f1"
}
}
},
{
$map: {
input: "$field2",
as: "f2",
in: {
field2: "$$f2"
}
}
}
]
}
},
initialValue: [],
in: {
"$concatArrays": [
[
{
"$mergeObjects": "$$this"
}
],
"$$value"
]
}
}
}
}
}
])
Убедитесь, что оба field1
и field2
имеют одинаковую длину, иначе вы потеряете некоторые данные.