Làm cách nào để hợp nhất hai đối tượng trong MongoDB?

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. com

ghi 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ố 8

Thê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"
    }

1

Cú pháp 2

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

2

Cú 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"
    }

90

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

9

Kết quả

const merged = {...obj1, ...obj2.favoriteteams}; 
1

Trong 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ốn

Tê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}; 
4

Chú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}; 
6

Kết quả

const merged = {...obj1, ...obj2.favoriteteams}; 
7

Trườ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ất

Giá 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ào

Như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"
    }

5

Kết quả

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

20

Ví 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

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}; 
10

Giả 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 sau

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

21

Chú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óm

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

22

Kết quả

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

23

Mả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 sau

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

24

Chú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}; 
40

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

25

Kết quả

Obj2: {
       "id": "123",
       "favoriteteams" : ["Yankees, "Knicks"],
       "home" : "NY"
    }

26

Cá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

Làm cách nào để kết hợp hai bộ sưu tập trong MongoDB?

Chúng ta có thể nối các tài liệu trên các bộ sưu tập trong MongoDB bằng cách sử dụng chức năng $lookup (Tập hợp) . $lookup(Aggregation) tạo liên kết ngoài cùng bên trái với một tập hợp khác và giúp lọc dữ liệu khỏi dữ liệu đã hợp nhất.

Làm cách nào để hợp nhất hai mảng trong tổng hợp MongoDB?

MongoDB cung cấp các loại toán tử biểu thức mảng khác nhau được sử dụng trong các giai đoạn đường ống tổng hợp và toán tử $concatArrays là một trong số đó. Toán tử này được sử dụng để nối hai hoặc nhiều mảng và trả về một mảng đã nối. Ở đây, mảng phải là một biểu thức hợp lệ cho đến khi nó phân giải thành một mảng.

$$ có nghĩa là gì trong MongoDB?

Trong biểu thức, ký hiệu đô la $ đánh giá thành đường dẫn trường; . e. cung cấp quyền truy cập vào trường . Ví dụ, biểu thức $eq $eq. [ "$price", "$1" ] thực hiện kiểm tra sự bằng nhau giữa giá trị trong trường có tên price và giá trị trong trường có tên 1 trong tài liệu.

$root trong MongoDB là gì?

Tài nguyên gốc là điểm bắt đầu cho API Trình quản lý đám mây . Từ đây, bạn có thể duyệt qua các liên kết để truy cập tất cả các tài nguyên API khác.