2016-08-02 18 views
5

Nếu tôi có tài liệu có cấu trúc tương tự như dưới đây. Tôi đang cập nhật chúng với kết quả tính toán và tôi muốn biết liệu kết quả đã được chèn vào tài liệu hay chưa. Hãy nói cho mỗi tài liệu tôi chạy tính toán 'c' và tính toán 'd'. Bây giờ tôi muốn hiển thị một bảng của tất cả các tài liệu và hiển thị cho dù một tính toán 'd' đã được thực hiện. Và đối với bảng này, tôi không quan tâm đến tính toán 'c'.Làm cách nào để chiếu trường có tồn tại

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document}, 
    "d":{large embedded document} 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{ 
    "c":{large embedded document} 
    } 
} 

Tôi muốn có kết quả cho tôi biết liệu tài liệu có chứa một trường cụ thể hay không. Ví dụ, tôi muốn biết liệu nó có chứa trường "resultsOfComputation.d" không, dù giá trị của trường đó là bao nhiêu.

Một ví dụ về kết quả của truy vấn cho "resultsOfComputation.d" sẽ là:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"resultsOfComputation":{ 
    "d":false 
    } 
} 

Nếu "resultsOfComputation.d" không có trong tài liệu nó cũng có thể được xác định, đó cũng là ok:

{ 
"_id":1 
"a":1, 
"resultsOfComputation":{ 
    "d":true 
    } 
} 

{ 
"_id":2 
"a":1, 
"resultsOfComputation":{} 
} 

Nói chung, ý tưởng là để có được tất cả các yếu tố gốc của các tài liệu, nhưng chỉ đúng/sai/không xác định cho được lựa chọn (một) kết quả của tính toán, kể từ khi kết quả tính toán là một tài liệu nhúng lớn .

Trả lời

4

Chạy đường ống kết hợp sau đây để có được những kết quả mong muốn:

db.collection.aggregate([ 
    { 
     "$project": { 
      "a": 1, 
      "resultsOfComputation": { 
       "d": { "$gt": ["$resultsOfComputation.d", null] } 
      } 
     } 
    } 
]) 

Sample Output

/* 1 */ 
{ 
    "_id" : 1, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : true 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "a" : 1, 
    "resultsOfComputation" : { 
     "d" : false 
    } 
} 
+1

Tôi đang thổi bay đi bởi truy vấn này! wow! chỉ là wow! Nhưng bạn có thể giúp tôi hiểu, cách '$ gt' đưa ra kết quả đúng hay sai? – Nattyk

+0

[câu trả lời được liên kết] này (http://stackoverflow.com/a/29837432/122005) giải thích tất cả. – chridam

+0

câu trả lời này hoạt động, tiếc là sử dụng tổng hợp là khá chậm đối với tôi, đặc biệt là khi tôi thêm vào bỏ qua các đường ống. Cuối cùng, tôi chỉ sử dụng tìm thay vì tổng hợp, với phép chiếu bao gồm tất cả các phần tử gốc của tài liệu và một trường mà tôi biết luôn nằm trong "resultsOfComputation.d" và sau đó tôi kiểm tra xem trường này có được xác định hay không. – Marcel

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