2015-06-04 25 views
5

Tôi có bộ sưu tập hồ sơ nhà hàng. Một số nhà hàng trong bộ sưu tập này thuộc về một số nhóm (nhà hàng kiểu chuỗi, ví dụ: KfC vv) trong khi các nhóm khác không có nhóm nào nhà hàng, mà không thuộc về bất kỳ chuỗi nào).Tìm nạp bản ghi riêng dựa trên giá trị cho bản ghi đó với MongoDB

dụ:

bộ sưu tập nhà hàng

{_id:"1",title:"rest1",address:"somethingx",chain_id:"123"}, 
{_id:"2",title:"rest2",address:"somethingx",chain_id:"123"}, 
{_id:"3",title:"rest3",address:"somethingy",chain_id:"0"}, 
{_id:"4",title:"rest4",address:"somethingx",chain_id:"0"} 

bộ sưu tập Chain:

{_id:"123",chain_name:"VSWEETS",address_deatils:[ 
              {restID:"",address:"somethingx"}, 
              {restID:"",address:"somethingx"} 
             ] 
} 

{_id:"456",chain_name:"KFC",address_deatils:[]} 

tôi cần phải lấy hàng riêng biệt với chain_id tương tự, tức là, chỉ có nhà hàng duy nhất nên đến nếu nó thuộc về một số chuỗi (chain_id! = 0)

+0

bạn có thể đăng bài đầu ra của bạn? – Yogesh

+0

như thể tôi tìm kiếm nhà hàng cho địa chỉ "somethingx". tôi cần nhận kết quả sau {_id: "1", tiêu đề: "rest1", địa chỉ: "somethingx", chain_id: "123"}, {_id: "4", tiêu đề: "rest4", địa chỉ: "somethingx", chain_id: "0"} –

+0

vẫn chưa rõ nếu bạn vượt qua 'địa chỉ: somethingx' sau đó bộ sưu tập nào được sử dụng để tìm' Nhà hàng' hoặc 'Chuỗi' và mối quan hệ nào được sử dụng, bạn đã đề cập trong' chain_id! = 0' và đầu ra chứa '{_id:" 4 ", tiêu đề:" rest4 ", địa chỉ:" somethingx ", chain_id:" 0 "}' – Yogesh

Trả lời

3

Bạn có thể sử dụng khung tổng hợp cho việc này. Đường ống tổng hợp sẽ có bước đầu tiên là $match nhà điều hành lọc các nhà hàng trên địa chỉ. Các $group đường ống giai đoạn sau đó sẽ nhóm các tài liệu lọc kết thúc bằng phím chain_id và áp dụng biểu thức ắc $first với hệ thống biến $$ROOT trên mỗi nhóm. Bạn có thể định dạng lại tài liệu bằng cách sử dụng giai đoạn đường ống $project.

Đường ống dẫn dầu kết hợp thức cung cấp cho bạn những kết quả mong muốn sau:

db.restaurant.aggregate([ 
    { 
     "$match": { "address" : "somethingx" } 
    }, 
    { 
     "$group": { 
      "_id": "$chain_id", 
      "data": { "$first": "$$ROOT" } 
     } 
    }, 
    { 
     "$project": { 
      "_id" : "$data._id", 
      "title" : "$data.title", 
      "address" : "$data.address", 
      "chain_id" : "$data.chain_id" 
     } 
    } 
]) 

Output:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "4", 
      "title" : "rest4", 
      "address" : "somethingx", 
      "chain_id" : "0" 
     }, 
     { 
      "_id" : "1", 
      "title" : "rest1", 
      "address" : "somethingx", 
      "chain_id" : "123" 
     } 
    ], 
    "ok" : 1 
} 
+0

Cảm ơn, tôi thực sự đánh giá cao sự giúp đỡ của bạn. câu trả lời này đã gần với những gì tôi thực sự cần. bạn có thể giúp tôi với phân trang & sắp xếp –

+0

@VishalSharma Không phải lo lắng, vui mừng được giúp đỡ. Đối với phân trang và phân loại, hãy xem xét áp dụng các toán tử đường ống sau: ** '$ limit' ** để giới hạn số lượng tài liệu trong kết quả, [**' $ skip' **] (http: //docs.mongodb. org/manual/reference/operator/aggregation/skip/# pipe._S_skip) để bỏ qua các tài liệu 'n' đầu tiên trong đó' n' là số bỏ qua được chỉ định và chuyển các tài liệu còn lại chưa sửa đổi thành đường dẫn, và cuối cùng là [** ' $ skip' **] (http://docs.mongodb.org/manual/reference/operator/aggregation/sort/#pipe._S_sort) để sắp xếp lại tài liệu trong kết quả bằng một phím sắp xếp được chỉ định. – chridam

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