Tôi đang vật lộn để hợp nhất hai đối tượng theo cách tôi cần bằng Node. js express và mongoDB. Dưới đây bạn sẽ thấy cả hai đối tượng ban đầu
Obj1: {
"name":"max",
"age":26,
"hometown": "NY"
}
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
Tôi hiện đang cố gắng
const merged = {...obj1, ...obj2.favoriteteams};
Nhưng điều đó mang lại cho tôi
merged: {
0: "Yankees"
1: "Knicks"
"name":"max",
"age":26,
"hometown": "NY"
}
Nhưng những gì tôi cần là
merged: {
"name":"max",
"age":26,
"hometown": "NY"
"favoriteteams": ["Yankees", "Knicks"];
}
Tôi cũng đã thử dùng
{
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
5 và sử dụng Object. gán[] nhưng cả hai rõ ràng sau đó chia lưới trong các trường tôi không cần từ obj2 [ID và nhà]. Thực tế, tôi chỉ cần lấy các nhóm yêu thích từ đối tượng thứ hai, nhưng tôi cần đó là một khóa mới trong đối tượng đầu tiên và cũng để duy trì phản hồi mảng với danh sách các chuỗi Giải trình. hợp nhất các đối tượng,
{
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
6 và {
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
7 trở thành khóa và {
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
8 trở thành giá trị. trong đối tượng {
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
9. sau đó tài liệu {
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
9 sẽ hợp nhất thành {
"data": {
"2010-07-25T22:07:00Z": 0,
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
"2020-10-06T21:07:00Z": 0,
},
1. kiểm tra đầu ra dự kiến{
"data": {
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
},
"t_f_t": {
"t_f": "2010-07-25T22:07:00Z",
"t_t": "2020-10-06T21:07:00Z",
"v": 0
}
}
Tài liệu đầu ra
{
"data": {
"2010-07-25T22:07:00Z": 0,
"2011-08-31T05:33:02Z": 1,
"2011-09-01T12:58:33Z": 1,
"2020-10-06T21:07:00Z": 0,
},
- stackoverflow. comghi bàn. 1
câu trả lời được chấp nhận
Một giải pháp tĩnh sẽ là giải pháp này
db.collection.aggregate[[
{
$set: {
t: [
{ k: "$t_f_t.t_f", v: "$t_f_t.v" },
{ k: "$t_f_t.t_t", v: "$t_f_t.v" }
]
}
},
{ $set: { t: { $arrayToObject: "$t" } } },
{ $project: { data: { $mergeObjects: ["$data", "$t"] } } },
]]
Nếu bạn cần một cái năng động hơn, thì hãy sử dụng
________số 8Thêm câu hỏi với thẻ tương tự
Trong MongoDB, toán tử đường dẫn tổng hợp
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 kết hợp nhiều tài liệu thành một tài liệu duy nhất
cú pháp
Toán tử
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 hỗ trợ hai cú pháp
Cú pháp 1
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
1Cú pháp 2
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
2Cú pháp đầu tiên chấp nhận nhiều đối số và cú pháp thứ hai chấp nhận một đối số
Ví dụ về Cú pháp 1 [Nhiều đối số]
Cú pháp đầu tiên liên quan đến việc cung cấp cho
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 nhiều hơn một đối số/tài liệu.
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 sau đó kết hợp các tài liệu đó thành một
Giả sử chúng ta có một bộ sưu tập tên là
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }7 với tài liệu sau
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }
Chúng ta có thể sử dụng
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 để hợp nhất các trường
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }9 và
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
90Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
9Kết quả
const merged = {...obj1, ...obj2.favoriteteams};
1Trong trường hợp này, chúng tôi đã hợp nhất cả hai trường thành một trường duy nhất có tên là
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
91. Nếu chúng tôi có nhiều trường/tài liệu hơn, chúng tôi cũng có thể hợp nhất chúng nếu muốnTên trường trùng lặp
Nếu các tài liệu được hợp nhất chứa các tên trường trùng lặp,
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 sẽ ghi đè lên trường khi nó hợp nhất các tài liệu. Do đó, trường trong tài liệu kết quả chứa giá trị từ tài liệu cuối cùng được hợp nhất cho trường đó
Giả sử chúng ta có tài liệu sau
const merged = {...obj1, ...obj2.favoriteteams};
4Chúng ta có thể thấy rằng cả hai tài liệu đều chứa một trường có tên là
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
93Đây là những gì xảy ra khi chúng tôi hợp nhất các tài liệu đó
const merged = {...obj1, ...obj2.favoriteteams};
6Kết quả
const merged = {...obj1, ...obj2.favoriteteams};
7Trường
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
93 trong tài liệu kết quả chứa Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
95, là giá trị từ tài liệu cuối cùng được hợp nhấtGiá trị Null
Nếu hợp nhất một tài liệu với
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
96, tài liệu kết quả sẽ được trả về mà không có bất kỳ thay đổi nàoNhưng nếu tất cả các tài liệu được hợp nhất là
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
96, thì một tài liệu trống sẽ được trả vềGiả sử chúng ta có các tài liệu sau
merged: {
0: "Yankees"
1: "Knicks"
"name":"max",
"age":26,
"hometown": "NY"
}
2Đây là những gì xảy ra khi chúng tôi hợp nhất các trường
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }9 và
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
90 trong hai tài liệu đómerged: {
0: "Yankees"
1: "Knicks"
"name":"max",
"age":26,
"hometown": "NY"
}
5Kết quả
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
20Ví dụ về Cú pháp 2 [Đối số đơn]
Dưới đây là hai ví dụ sử dụng cú pháp đối số duy nhất
Bộ tích lũy sân khấu const merged = {...obj1, ...obj2.favoriteteams};
10
const merged = {...obj1, ...obj2.favoriteteams};
Trong ví dụ đầu tiên,
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 được sử dụng làm bộ tích lũy giai đoạn
const merged = {...obj1, ...obj2.favoriteteams};
10Giả sử chúng ta có một bộ sưu tập tên là
const merged = {...obj1, ...obj2.favoriteteams};
13 với các tài liệu sauObj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
21Chúng tôi có thể nhóm các tài liệu này theo trường
const merged = {...obj1, ...obj2.favoriteteams};
14 của chúng, sau đó sử dụng { "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 để hợp nhất trường
const merged = {...obj1, ...obj2.favoriteteams};
16 cho mỗi nhómObj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
22Kết quả
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
23Mảng
Ví dụ này áp dụng
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 cho một tài liệu có chứa một trường có một mảng tài liệu
Giả sử chúng ta có một bộ sưu tập tên là
const merged = {...obj1, ...obj2.favoriteteams};
18 với các tài liệu sauObj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
24Chúng ta có thể áp dụng
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 cho trường
const merged = {...obj1, ...obj2.favoriteteams};
40Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
25Kết quả
Obj2: {
"id": "123",
"favoriteteams" : ["Yankees, "Knicks"],
"home" : "NY"
}
26Các trường bị thiếu
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }3 bỏ qua mọi trường bị thiếu. Nghĩa là, nếu bạn cung cấp một trường không tồn tại, nó sẽ bỏ qua nó. Nếu không có trường nào tồn tại, thì nó sẽ trả về một tài liệu trống