Để truy xuất nhóm theo kết quả với mảng, hãy sử dụng hàm tổng hợp[]. Chúng tôi cũng sẽ sử dụng toán tử $addToSet. Nó thêm một giá trị vào một mảng trừ khi giá trị đó đã có sẵn, trong trường hợp đó $addToSet không làm gì với mảng đó
Hãy để chúng tôi tạo một bộ sưu tập với các tài liệu -
> db.demo498.insertOne[{id:1,Name:["Chris"]}];{ "acknowledged" : true, "insertedId" : ObjectId["5e86192b987b6e0e9d18f553"] } > db.demo498.insertOne[{id:2,Name:["David"]}];{ "acknowledged" : true, "insertedId" : ObjectId["5e86192d987b6e0e9d18f554"] } > db.demo498.insertOne[{id:3,Name:["Chris"]}];{ "acknowledged" : true, "insertedId" : ObjectId["5e861931987b6e0e9d18f555"] } > db.demo498.insertOne[{id:4,Name:["Bob"]}];{ "acknowledged" : true, "insertedId" : ObjectId["5e861942987b6e0e9d18f556"] } > db.demo498.insertOne[{id:5,Name:["David"]}];{ "acknowledged" : true, "insertedId" : ObjectId["5e861947987b6e0e9d18f557"] }
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.demo498.find[];
Điều này sẽ tạo ra đầu ra sau -
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
Sau đây là truy vấn để truy xuất nhóm theo kết quả với mảng trong MongoDB -
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]
Điều này sẽ tạo ra đầu ra sau -
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }
Về cơ bản, điều tôi muốn là truy xuất dữ liệu sao cho mảng con dấu trang có mảng con chứa dấu trang với quốc gia cụ thể
Vì vậy, thay vì
"bookmarks": [
{
"_id": {
"$oid": "60eb42f1137d8b00035e32a0"
},
"name": "Long Island City",
"country": "US",
"latitude": 34.127871999999996,
"longitude": -80.84848640000001
}
nó sẽ là
"bookmarks": [
"US": [
{
"_id": {
"$oid": "60eb42f1137d8b00035e32a0"
},
"name": "Long Island City",
"country": "US",
"latitude": 34.127871999999996,
"longitude": -80.84848640000001
}]
]
trong khi vẫn giữ thông tin người dùng như tên, nhà cung cấp, v.v.
Hiện tại, đường ống của tôi trông như thế này
[
{
'$match': {
'_id': new ObjectId['60dd583e38a494001e7cbe01']
}
}, {
'$unwind': {
'path': '$bookmarks',
'preserveNullAndEmptyArrays': false
}
}
]
phân tách mục nào trong mảng con nhưng tôi không chắc làm cách nào để đặt chúng trở lại theo cách tôi muốn chúng trông
Tôi chưa quen với mongodb và có thể tôi đang thiếu thứ gì đó. Nhưng có rất nhiều mẫu trên internet, vẫn gặp sự cố khi lấy tổng trên một trường là một phần của mảng đối tượng. Đây là những gì tôi đang làm
________số 8cố gắng để có được tổng số tiền theo những cách khác nhau
db.collection.aggregate[[
{$group:{_id:null, TotalBalance:{$sum:"$balance.amount"}}}
]]
lấy số dư 0 thay vì -2300
> db.demo498.find[];0
những điều tương tự với $unwind
> db.demo498.find[];1
những gì tôi đang làm sai?
Cảm ơn
Nếu đối số không phân giải thành một mảng hoặc
> db.demo498.find[];21 cũng như không đề cập đến một trường bị thiếu, thì sẽ trả về lỗi
> db.demo498.find[];
26
sự biểu lộ
Bộ > db.demo498.find[];
27 tích lũy ban đầu trước > db.demo498.find[];
28 được áp dụng cho phần tử đầu tiên của mảng > db.demo498.find[];
20
> db.demo498.find[];
28
sự biểu lộ
Giá trị mà > db.demo498.find[];
88 áp dụng cho từng phần tử trong mảng > db.demo498.find[];
20 theo thứ tự từ trái sang phải. Bọc giá trị > db.demo498.find[];
20 bằng để mang lại kết quả tương đương với việc áp dụng biểu thức kết hợp từ phải sang trái
Trong quá trình đánh giá biểu thức
> db.demo498.find[];28, sẽ có hai biến
> db.demo498.find[];
27 là biến đại diện cho giá trị tích lũy của biểu thức{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
37 là biến tham chiếu đến phần tử đang được xử lý
Nếu
> db.demo498.find[];20 phân giải thành một mảng trống, trả về
> db.demo498.find[];26
Ví dụ
Kết quả
> db.demo498.find[];
8
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] }
{ "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] }
{ "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
71
> db.demo498.find[];
2
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] }
{ "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] }
{ "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
72
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] }
{ "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] }
{ "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
3
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] }
{ "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] }
{ "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] }
{ "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
73
ví dụ
Phép nhân
xác suất
Một bộ sưu tập có tên
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }74 chứa các sự kiện của một thí nghiệm xác suất. Mỗi thử nghiệm có thể có nhiều
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }74, chẳng hạn như tung xúc xắc nhiều lần hoặc rút nhiều thẻ [không thay thế] liên tiếp để đạt được kết quả mong muốn. Để có được xác suất tổng thể của thí nghiệm, chúng ta sẽ cần nhân xác suất của từng sự kiện trong thí nghiệm
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }7
bước
Sử dụng
{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
76 để nhóm theo{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
77 và sử dụng{ "_id" : ObjectId["5e86192b987b6e0e9d18f553"], "id" : 1, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e86192d987b6e0e9d18f554"], "id" : 2, "Name" : [ "David" ] } { "_id" : ObjectId["5e861931987b6e0e9d18f555"], "id" : 3, "Name" : [ "Chris" ] } { "_id" : ObjectId["5e861942987b6e0e9d18f556"], "id" : 4, "Name" : [ "Bob" ] } { "_id" : ObjectId["5e861947987b6e0e9d18f557"], "id" : 5, "Name" : [ "David" ] }
78 để tạo một mảng với xác suất của từng sự kiệnSử dụng
> db.demo498.find[];
88 với> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]
90 để nhân và kết hợp các phần tử của> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]
91 thành một giá trị duy nhất và chiếu giá trị đó
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]9
Hoạt động trả về như sau
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }2
hàng giảm giá
Một bộ sưu tập có tên
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]92 chứa các tài liệu sau
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }4
Mỗi tài liệu chứa một mảng
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]93 chứa các phiếu giảm giá theo phần trăm hiện có cho mỗi mặt hàng. Nếu mỗi lần giảm giá có thể được áp dụng cho sản phẩm một lần, chúng ta có thể tính giá thấp nhất bằng cách sử dụng
> db.demo498.find[];88 để áp dụng công thức sau cho mỗi phần tử trong mảng
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]93. [1 - giảm giá] * giá
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }8
Hoạt động trả về như sau
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }9
nối chuỗi
Một bộ sưu tập có tên
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]96 chứa các tài liệu sau
> db.demo498.find[];80
Ví dụ sau rút gọn mảng chuỗi
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]97 thành một chuỗi duy nhất
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]98
> db.demo498.find[];81
Hoạt động trả về như sau
> db.demo498.find[];82
nối mảng
Một bộ sưu tập có tên
> db.demo498.aggregate[[{ .. $unwind : "$Name" .. }, { .. $group : { .. _id : $quot;$Name", .. Id : { .. $addToSet : "$id" .. } .. } .. } .. ]]99 chứa các tài liệu sau
> db.demo498.find[];83
Tính toán một lần giảm
Ví dụ sau thu gọn mảng hai chiều thành một mảng duy nhất
{ "_id" : "David", "Id" : [ 5, 2 ] } { "_id" : "Bob", "Id" : [ 4 ] } { "_id" : "Chris", "Id" : [ 3, 1 ] }20
> db.demo498.find[];84
Hoạt động trả về như sau
> db.demo498.find[];85
Tính toán nhiều lần giảm
Ví dụ sau thực hiện thu gọn mảng hai chiều giống như ví dụ trên, nhưng cũng tạo một mảng mới chỉ chứa phần tử đầu tiên của mỗi mảng