MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

$ unwind một đối tượng trong khung tổng hợp

Không thể thực hiện loại tính toán mà bạn đang mô tả với khung tổng hợp - và điều đó không vì không có $unwind phương thức cho không phải mảng. Ngay cả khi các đối tượng person:value là tài liệu trong một mảng, $unwind sẽ không giúp ích gì.

Chức năng "nhóm theo" (cho dù trong MongoDB hay trong bất kỳ cơ sở dữ liệu quan hệ nào) được thực hiện trên giá trị của một trường hoặc cột. Chúng tôi nhóm theo giá trị của trường và tổng / trung bình / v.v. dựa trên giá trị của trường khác.

Ví dụ đơn giản là một biến thể của những gì bạn đề xuất, trường xếp hạng được thêm vào bộ sưu tập bài viết mẫu, nhưng không phải là một bản đồ từ người dùng đến xếp hạng mà là một mảng như thế này:

{ title : title of article", ...
  ratings: [
         { voter: "user1", score: 5 },
         { voter: "user2", score: 8 },
         { voter: "user3", score: 7 }
  ]
}

Bây giờ bạn có thể tổng hợp điều này với:

[ {$unwind: "$ratings"},
  {$group : {_id : "$ratings.voter", averageScore: {$avg:"$ratings.score"} } } 
]

Nhưng ví dụ này có cấu trúc như bạn mô tả, nó sẽ giống như thế này:

{ title : title of article", ...
  ratings: {
         user1: 5,
         user2: 8,
         user3: 7
  }
}

hoặc thậm chí thế này:

{ title : title of article", ...
  ratings: [
         { user1: 5 },
         { user2: 8 },
         { user3: 7 }
  ]
}

Ngay cả khi bạn có thể $unwind điều này, không có gì để tổng hợp ở đây. Trừ khi bạn biết danh sách đầy đủ của tất cả các khóa có thể có (người dùng), bạn không thể làm gì nhiều với việc này. [*]

Một lược đồ DB quan hệ tương tự với những gì bạn có sẽ là:

CREATE TABLE T (
   user1: integer,
   user2: integer,
   user3: integer
   ...
);

Đó không phải là những gì sẽ được thực hiện, thay vào đó chúng tôi sẽ làm điều này:

CREATE TABLE T (
   username: varchar(32),
   score: integer
);

và bây giờ chúng tôi tổng hợp bằng cách sử dụng SQL:

select username, avg(score) from T group by username;

Có một yêu cầu nâng cao cho MongoDB có thể cho phép bạn thực hiện điều này trong khuôn khổ tổng hợp trong tương lai - khả năng chiếu các giá trị vào các khóa để ngược lại. Trong khi đó, luôn có bản đồ / thu nhỏ.

[*] Có một cách phức tạp để thực hiện việc này nếu bạn biết tất cả các khóa duy nhất (bạn có thể tìm tất cả các khóa duy nhất bằng một phương pháp tương tự như thế này) nhưng nếu bạn biết tất cả các khóa, bạn cũng có thể chạy một chuỗi các truy vấn của form db.articles.find({"ratings.user1":{$exists:true}},{_id:0,"ratings.user1":1}) đối với mỗi userX sẽ trả về tất cả xếp hạng của họ và bạn có thể tổng hợp và tính trung bình chúng một cách đơn giản thay vì thực hiện một phép chiếu rất phức tạp mà khung tổng hợp sẽ yêu cầu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Xây dựng một ấn phẩm phản ứng với các trường bổ sung trong mỗi tài liệu

  2. PostgreSQL so với MongoDB

  3. Mongoose:Nhận danh sách người dùng đầy đủ

  4. Các thao tác ghi tệp trong mongo script?

  5. Làm cho các truy vấn mongoose.js chạy đồng bộ