2012-02-11 29 views
11

Tôi đang cố gắng 'so sánh' tất cả tài liệu giữa 2 bộ sưu tập, sẽ chỉ trả lại đúng và nếu chỉ tất cả các tài liệu bên trong 2 bộ sưu tập đều giống nhau.Làm thế nào để so sánh 2 bộ sưu tập mongodb?

Tôi đã tìm kiếm các phương pháp trên bộ sưu tập, nhưng không thể tìm thấy một phương pháp có thể thực hiện việc này.

tôi đã thử nghiệm một cái gì đó như thế này trong vỏ Mongo, nhưng không phải làm việc như tôi mong đợi:

db.test1 == db.test2 

hoặc

db.test1.to_json() == db.test2.to_json() 

Dù sao, im cũng sử dụng lò xo dữ liệu MongoDB trong java.

Hãy chia sẻ suy nghĩ của bạn! Cảm ơn bạn.

+3

Sử dụng 'db.runCommand ('dbHash')' sẽ lấy cho bạn các băm cho db và bộ sưu tập của bạn, trong đó bạn có thể so sánh băm bộ sưu tập với một băm bộ sưu tập khác. Có thể dễ dàng hơn nếu biết cả hai bộ sưu tập đều giống nhau. – Rexford

Trả lời

13

Bạn có thể thử sử dụng mongodb eval kết hợp với chức năng tùy chỉnh bằng, giống như this.

Phương pháp của bạn không hoạt động vì trong trường hợp đầu tiên bạn so sánh các tham chiếu đối tượng, không giống nhau. Trong trường hợp thứ hai, không có sự đảm bảo rằng to_json sẽ tạo ra cùng một chuỗi ngay cả đối với các đối tượng giống nhau.

Thay vào đó, hãy thử một cái gì đó như thế này:

var compareCollections = function(){ 
    db.test1.find().forEach(function(obj1){ 
     db.test2.find({/*if you know some properties, you can put them here...if don't, leave this empty*/}).forEach(function(obj2){ 
      var equals = function(o1, o2){ 
       // here goes some compare code...modified from the SO link you have in the answer. 
      }; 

      if(equals(ob1, obj2)){ 
       // Do what you want to do 
      } 
     }); 
    }); 
}; 

db.eval(compareCollections); 

Với db.eval bạn đảm bảo mã mà sẽ được thực hiện ở phía máy chủ cơ sở dữ liệu, mà không lấy bộ sưu tập cho khách hàng.

+0

Cảm ơn ý tưởng. Nếu tôi hiểu chính xác, điều này thực sự có 2 vòng, trong đó 1 tài liệu trong test1 sẽ được kiểm tra với tất cả các tài liệu trong test2 ..? Hoặc có lẽ những gì bạn có nghĩa là trong đối số test2.find, chúng tôi đặt id của obj1, bởi vì trong trường hợp của tôi, những gì trong test1 phải nằm trong test2 với cùng một id. Và cũng có thể, im khá bối rối về những gì nếu test2 có nhiều tài liệu hơn test1, hoặc nếu test1 có nhiều tài liệu hơn test2, trong trường hợp của tôi có nghĩa là test1 và test2 không bằng. Bất kỳ suy nghĩ nào về việc phát hiện chúng mà không lặp lại cả hai mặt của các bộ sưu tập? Cảm ơn ! – bertie

+0

Mã này trải qua cả hai bộ sưu tập và thực hiện điều gì đó khi tìm thấy kết quả phù hợp từ bộ sưu tập đầu tiên trong bộ sưu tập thứ hai (hoặc bạn có thể làm gì đó khi không tìm thấy kết quả khớp, chỉ cần đặt if (! Equals (...) Nếu bạn muốn để so sánh nếu cả hai bộ sưu tập đều bằng nhau, điều này có thể được tối ưu hóa rất nhiều ... ví dụ, trước khi thực hiện db.test1.find bạn có thể so sánh số của cả hai bộ sưu tập, như db.test1.find(). count() == db .test2.find(). count() ... và nếu đếm không bằng nhau, không có lý do gì để tiếp tục. Ngoài ra, như tôi đã chỉ ra mã, nếu có một số thuộc tính bạn biết (như _id) bạn (tiếp tục ...) –

+0

có thể đặt nó bên trong db.test2.find ({... ở đây ...}) và tăng tốc độ tra cứu đối tượng thứ hai) .Vì vậy, nếu số lượng của bạn bằng nhau, và bạn không bao giờ đi vào nếu (bằng (...)) thì bộ sưu tập của bạn bằng nhau ... Điều quan trọng là, cuối cùng, bạn sử dụng db.eval để đảm bảo rằng mã của bạn được thực thi trực tiếp trên máy chủ, hoặc ngược lại, bạn sẽ kết thúc tìm nạp ing cả hai bộ sưu tập cho khách hàng mà có thể làm chậm mọi thứ rất nhiều. –

Các vấn đề liên quan