Để nối trong MongoDB, hãy sử dụng $concat trong $project. Hãy để chúng tôi tạo một bộ sưu tập với các tài liệu -
> db.demo359.insertOne[ .. { ... .. Name1: "Chris", .. Name2: "David", .. Subjects: ["MySQL","MongoDB","Java"] .. } .. ]; { "acknowledged" : true, "insertedId" : ObjectId["5e5694cdf8647eb59e5620d0"] }
Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find[] -
> db.demo359.find[].pretty[];
Điều này sẽ tạo ra đầu ra sau -
{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "Name1" : "Chris", "Name2" : "David", "Subjects" : [ "MySQL", "MongoDB", "Java" ] }
Sau đây là truy vấn để nối các giá trị của mảng với các trường khác -
> db.demo359.aggregate[[ .. { .. $project: { .. values: { .. $reduce: { .. input: '$Subjects', .. initialValue: '', .. in: { .. $concat: ['$$value',' ','$$this'] .. } .. } .. }, .. Name1: 1 .. } .. }, .. { .. $project: { .. 'ConcatResult': { '$concat': [ '$Name1', '$values'] } .. } .. } .. ]] { "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "ConcatResult" : "Chris MySQL MongoDB Java" }
Điều này sẽ tạo ra đầu ra sau -
{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "ConcatResult" : "Chris MySQL MongoDB Java" }
Tôi muốn nối các giá trị trường mảng int bên trong một mảng đối tượng thành một trường chuỗi sau khi chia chúng [cho 10]
Đây là định dạng tài liệu hiện có
{
"no" : "2020921008981",
"date" : ISODate["2020-04-01T05:19:02.263+0000"],
"sale" : {
"soldItems" : [
{
"itemRefId" : "5b55ac7f0550de00210a3b24",
"soldPrice" : NumberInt[800],
},
{
"itemRefId" : "5b55ac7f0550de00210a3b25",
"soldPrice" : NumberInt[1000],
}
]
}
}
kết quả mong đợi
{
"no" : "2020921008981",
"date" : ISODate["2020-04-01T05:19:02.263+0000"],
"priceList" : "8.0 \n 10.0"
}
Nỗ lực với $reduce
priceList: {
$reduce: {
input: "$sale.soldItems.soldPrice",
initialValue: "",
in: {
$cond: [ { "$eq": [ { $toString: { $divide: [ "$$value", 10 ] } }, "" ] }, "$$this", { $concat: [ { $toString: { $divide: [ "$$value", 10 ] } }, "\n", "$$this" ] } ]
}
}
}
Nhưng cuối cùng lại nhận được lỗi
> db.demo359.aggregate[[ .. { .. $project: { .. values: { .. $reduce: { .. input: '$Subjects', .. initialValue: '', .. in: { .. $concat: ['$$value',' ','$$this'] .. } .. } .. }, .. Name1: 1 .. } .. }, .. { .. $project: { .. 'ConcatResult': { '$concat': [ '$Name1', '$values'] } .. } .. } .. ]] { "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "ConcatResult" : "Chris MySQL MongoDB Java" }2. Bất kỳ ý tưởng sẽ được đánh giá cao
Trong MongoDB, toán tử đường dẫn tổng hợp
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
2 nối hai hoặc nhiều mảng và trả về mảng được nốiVí dụ
Giả sử chúng ta có một bộ sưu tập tên là
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
3 với tài liệu sau> db.demo359.find[].pretty[];0
Chúng ta có thể sử dụng toán tử
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
2 để nối mảng của trường db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
5 với mảng của trường db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
6________số 8Kết quả
> db.demo359.find[].pretty[];5
Mảng trống
Nối một mảng với một mảng trống không thay đổi bất cứ điều gì
Giả sử bộ sưu tập của chúng tôi cũng chứa tài liệu sau
> db.demo359.find[].pretty[];6
Hãy áp dụng
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
2 cho điều đó> db.demo359.find[].pretty[];8
Kết quả
> db.demo359.find[].pretty[];9
Chúng tôi kết thúc với mảng đầu tiên mà không có bất kỳ thay đổi nào
Các trường bị thiếu
Cố gắng nối một trường với một trường không tồn tại trả về
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
8Hãy tưởng tượng bộ sưu tập của chúng tôi cũng chứa tài liệu sau
{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "Name1" : "Chris", "Name2" : "David", "Subjects" : [ "MySQL", "MongoDB", "Java" ] }1
Đây là những gì xảy ra khi chúng tôi áp dụng
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
2 cho trường db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
5 và trường không tồn tại{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "Name1" : "Chris", "Name2" : "David", "Subjects" : [ "MySQL", "MongoDB", "Java" ] }4
Kết quả
{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "Name1" : "Chris", "Name2" : "David", "Subjects" : [ "MySQL", "MongoDB", "Java" ] }5
Các loại dữ liệu khác
Mỗi biểu thức được cung cấp cho
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
2 có thể là bất kỳ biểu thức hợp lệ nào, miễn là nó phân giải thành một mảngNếu nó không giải quyết thành một mảng, một lỗi sẽ được trả về
Giả sử chúng ta có tài liệu sau
{ "_id" : ObjectId["5e5694cdf8647eb59e5620d0"], "Name1" : "Chris", "Name2" : "David", "Subjects" : [ "MySQL", "MongoDB", "Java" ] }7
Đây là điều sẽ xảy ra nếu chúng ta cố gắng nối các trường
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
5 và db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
6db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
0Kết quả
db.data.aggregate[[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $concatArrays: [ "$a", "$b" ] }
}
}
]]
1Trong ví dụ này, tôi đã cố gắng nối một mảng với một giá trị kép nhưng tôi gặp lỗi cho biết $concatArrays chỉ hỗ trợ mảng, không hỗ trợ giá trị kép