2013-07-18 31 views
5

Với một bộ sưu tập với các tài liệu như:MongoDB tìm thấy bằng giá trị tối đa trong mảng văn

{ 
    "host" : "example.com", 
    "ips" : [ 
     { 
      "ip" : NumberLong("1111111111"), 
      "timestamp" : NumberLong(1373970044) 
     }, 
     { 
      "ip" : NumberLong("2222222222"), 
      "timestamp" : NumberLong(1234978746) 
     } 
    ] 
} 

Tôi cần phải trả lại toàn bộ tài liệu có giá trị IP của X, nhưng chỉ khi timestamp liên quan cho X là dấu thời gian cao nhất trong mảng ips (vì vậy tài liệu ví dụ trên phải không phải khớp với tìm kiếm "2222222222" vì đó là không phải là IP có dấu thời gian gần đây nhất).

Đây là lần đầu tiên tôi làm bất cứ điều gì nhiều ngoài những thứ khá cơ bản trong MongoDB nên gần nhất tôi đã có thể nhận được là:

coll.aggregate ({$ trận đấu: { "ips.ip" : X}}, {$ nhóm: {"_ id": "$ host", "tối đa": {$ max: "$ ips.timestamp"}}}, {$ sort: {"ips.timestamp": - 1}}). Kết quả

Rõ ràng là không cung cấp cho tôi những gì tôi đang tìm kiếm, nó trả về bất kỳ thứ gì có giá trị ips.ip X. Làm cách nào để chỉ trả lại tài liệu trong đó ip.ip là X chỉ khi dấu thời gian được liên kết của X là giá trị cao nhất cho mảng ips đó?

Trả lời

11

Nếu máy chủ là duy nhất, mã sau sẽ thực hiện công việc. Nếu không, bạn cam chỉ cần thay thế máy chủ bằng _id trong thao tác nhóm

coll.aggregate([ 
    {$unwind: "$ips"}, 
    {$project:{host:"$host",ip:"$ips.ip", ts:"$ips.timestamp"} }, 
    {$sort:{ts:1} }, 
    {$group: {_id: "$host", IPOfMaxTS:{$last: "$ip"}, ts:{$last: "$ts"} } } 
]) 

Tôi hy vọng điều đó sẽ hữu ích.

+0

Đó là gần, nhưng như là sẽ trả lại toàn bộ tài liệu, thêm trong '{$ trận đấu: { "ips.ip": X}} 'sẽ chỉ trả lại các tài liệu có mục nhập ips.ip cho X, nhưng tôi muốn nó chỉ trả lại những vị trí mà ips.ip là X nếu dấu thời gian của X là dấu thời gian gần nhất. Tôi nghĩ có lẽ việc thay đổi kết quả thành '$ match: {" IPOfMaxTS ": X}}' sẽ hoạt động, nhưng điều đó tiếp tục trả về một tập kết quả trống. (những gì tôi đang cố gắng làm có thể không có trong MongoDB, nếu không được, tôi có thể thêm một kiểm tra ở tầng ứng dụng, tôi chỉ muốn xử lý điều này ở lớp db nếu có thể) – Exupery

+0

Bỏ qua ở trên bình luận, Tôi đã đi đúng hướng tôi chỉ ngu ngốc đặt các trận đấu ở vị trí sai, đặt '$ match: {" IPOfMaxTS ": X}}' _after_ hoạt động nhóm cho tôi chính xác những gì tôi đang tìm kiếm. Cảm ơn đã giúp đỡ! – Exupery

+2

Cảm ơn, chức năng $ thư giãn này đã làm việc cho một vấn đề tương tự đối với tôi. –

0

TRÊN Simple Words, nếu bạn có đáp ứng truy vấn Mongo cái gì đó như dưới đây - và bạn muốn chỉ có giá trị cao nhất từ ​​Array-> "Ngày"

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Date": [ 
    "2017-02-13T00:00:00.000Z", 
    "2017-03-05T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 

}, 

*** Sau đó, bạn có thêm

Latest_Wish_CreatedDate: {$ max: "$ Date"},

somthing như liệt kê dưới đây

{ 
       $project : { _id: 1, 
          TotalWishs : 1 , 
           wish:1 , 
           Events:1, 
           Wish_CreatedDate:1, 
           Latest_Wish_CreatedDate: { $max: "$Date"}, 
          } 
      } 

Và cuối cùng Query đáp ứng sẽ được dưới

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Wish_CreatedDate": [ 
    "2017-03-05T00:00:00.000Z", 
    "2017-02-13T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 
    "Latest_Wish_CreatedDate": "2017-03-05T00:00:00.000Z" 
}, 
Các vấn đề liên quan