Mảng nhóm mongodb của các đối tượng

Để 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 ] }

Mảng nhóm mongodb của các đối tượng


Mảng nhóm mongodb của các đối tượng

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

cố 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

  1. 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ện

  2. Sử 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

Làm cách nào để nhóm mảng đối tượng theo khóa trong MongoDB?

Nhóm và đẩy các đối tượng trong mảng nếu chúng có cùng khóa trong tài liệu mongodb .
$unwind giải cấu trúc mảng appInfos
$group theo tài nguyên và app_key và xây dựng mảng siêu dữ liệu
một lần nữa $group chỉ bằng tài nguyên và xây dựng lại mảng appInfos mà chúng tôi đã giải cấu trúc trong giai đoạn đầu tiên

Làm cách nào để nhóm giá trị mảng trong MongoDB?

Để truy xuất nhóm theo kết quả bằng mảng, 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 đó. > db.

Làm cách nào để đẩy đối tượng vào mảng trong MongoDB?

Trong MongoDB, toán tử $push được sử dụng để nối một giá trị đã chỉ định vào một mảng . Nếu trường được đề cập không có trong tài liệu để cập nhật, toán tử $push sẽ thêm trường đó dưới dạng trường mới và bao gồm giá trị được đề cập làm thành phần của nó. Nếu trường cập nhật không phải là trường kiểu mảng thì thao tác không thành công.

Đối tượng tích lũy trong MongoDB là gì?

Bộ tích lũy là toán tử duy trì trạng thái của chúng (e. g. tổng, giá trị lớn nhất, giá trị nhỏ nhất và dữ liệu liên quan) khi tài liệu tiến triển trong quy trình . Sử dụng toán tử $accumulator để thực thi các hàm JavaScript của riêng bạn nhằm triển khai hành vi không được Ngôn ngữ truy vấn MongoDB hỗ trợ.