2015-01-19 16 views
6

Nói rằng tôi có điều này:phím động từ giá trị trong MongoDB

{ 
     "_id" : "ENVD", 
     "years" : [ 
       { 
         "year" : "2013", 
         "avgInstructor" : 5.144999999999998 
       }, 
       { 
         "year" : "2012", 
         "avgInstructor" : 5.194436090225564 
       } 
     ] 
} 

tôi cần để có thể tìm ra sự khác biệt trong lĩnh vực avgInstructor 2012-13. Tôi đã nghĩ rằng tôi có thể chuyển đổi các phím bằng cách nào đó bằng cách sử dụng một $project mà sẽ làm cho năm là chìa khóa, và đánh giá avgInstructor là giá trị. Vì vậy, nó sẽ trông như thế này:

{ 
     "_id" : "ENVD", 
     "years" : { 
         "2013" : 5.144999999999998, 
         "2012" : 5.194436090225564 
     } 

} 

Điều này có thể? Hãy nhớ rằng mục tiêu chính của tôi là có thể chạy phép trừ như mã giả này: years['2013'].avgInstructor - years['2013'].avgInstructor. Vì vậy, nếu bạn thấy một cách dễ dàng hơn, điều đó cũng sẽ tuyệt vời. Tôi không chắc chắn về cách tốt nhất để đi về điều này trong bối cảnh của một đường ống tổng hợp. Ai đó có thể giúp đỡ?

+1

Không bao giờ ngừng làm tôi ngạc nhiên vì sao mọi người nghĩ đây là một điều tốt đẹp tùy theo cách nó được lưu trữ. Cũng không có vấn đề gì bạn muốn làm ở đây, nó có khả năng sẽ có hiệu quả hơn trong mã nếu bạn không thực sự tổng hợp bất cứ điều gì giữa các tài liệu. –

+0

Bạn có thấy nhận xét của tôi về việc cung cấp giải pháp tốt hơn nếu bạn thấy một giải pháp không? Bạn bình luận không giúp được gì nhiều. Một vài lưu ý: 1) Đây là một tập dữ liệu nhỏ, do đó hiệu suất không phải là ưu tiên tối đa. 2) Tôi đã được yêu cầu hoàn thành việc này bằng cách sử dụng * only * một truy vấn Mongo. Đó là chủ yếu là một kinh nghiệm học tập, và tôi rất thích thực sự mã này ra (nó là một vấn đề tương đối đơn giản, sau đó). – ianks

+0

Tôi nghĩ điều đó và ít nhất một người đồng ý. Có vẻ như giải pháp tốt nhất là để nó như vậy. Điều gì là sai với chỉ trừ: 'năm [0] .avgInstructor - năm [1] .avgInstructor' hoặc với' indexOf ("2013)' sau một 'map()' cho giá trị trường để lấy chỉ mục phần tử hoặc bất kỳ ngôn ngữ nào Bạn không phải là tài liệu tổng hợp, do đó, nó có vẻ như công việc không cần thiết. –

Trả lời

0

Một câu trả lời có thể xảy ra ...

  1. Thư giãn dự án
  2. đầu tiên để làm cho nó một chút dễ dàng hơn để xử lý
  3. Sắp xếp trên _id và sau đó vào năm
  4. nhóm bởi _id để đón đầu tiên và giá trị mới nhất
  5. phép chiếu cuối cùng để lấy giá trị được trừ

    db.coll.aggregate ([ 
    
         { "$unwind" : "$years" } , 
    
         { $project : { "year" : "$years.year", "avgInstructor" : "$years.avgInstructor" } }, 
    
         { $sort : { "_id" : 1, "year" : 1 } }, 
    
         { $group : { "_id" : "$_id", "val_min" : { $first : "$avgInstructor" }, "val_max" : { $last : "$avgInstructor" } } }, 
    
         { $project : { "diff" : { $subtract : [ "$val_min", "$val_max" ] } } } 
    
    ]) 
    
Các vấn đề liên quan