2011-09-02 33 views
8

Tôi có một số tài liệu được lưu trong một bộ sưu tập (gọi tắt là urls) trông như thế này:MongoDB - trận đấu regex các phím cho các tài liệu phụ

{ 
    payload:{ 
     url_google.com:{ 
      url:'google.com', 
      text:'search' 
     } 
    } 
}, 
{ 
    payload:{ 
     url_t.co:{ 
      url:'t.co', 
      text:'url shortener' 
     } 
    } 
}, 
{ 
    payload:{ 
     url_facebook.com:{ 
      url:'facebook.com', 
      text:'social network' 
     } 
    } 
} 

Sử dụng Mongo CLI, là nó có thể tìm kiếm các tài liệu phụ của payload rằng phù hợp với /^url_/? Và, nếu có thể, cũng sẽ có thể truy vấn trên các trang con của đối sánh (ví dụ: đảm bảo có tồn tại text)?

Tôi đã suy nghĩ một cái gì đó như thế này:

db.urls.find({"payload":{"$regex":/^url_/}}).count(); 

Nhưng đó là trở về 0 kết quả.

Bất kỳ trợ giúp hoặc đề xuất nào đều tuyệt vời.

Cảm ơn,

Matt

Trả lời

5

Nó không thể truy vấn chống lại các phím tài liệu theo cách này. Bạn có thể tìm kiếm các kết quả khớp chính xác bằng cách sử dụng $exists, nhưng bạn không thể tìm thấy tên khóa khớp với mẫu.

Tôi giả sử (có lẽ không chính xác) bạn đang cố gắng tìm tài liệu có tài liệu phụ URL và không phải tất cả tài liệu đều có tài liệu này? Tại sao không đẩy rằng loại thông tin xuống một mức độ, một cái gì đó như:

{ 
    payload: { 
    type: "url", 
    url: "Facebook.com", 
    ... 
    } 
} 

Sau đó, bạn có thể truy vấn như:

db.foo.find({"payload.type": "url", ...}) 

Tôi cũng sẽ thật thiếu sót nếu tôi không lưu ý rằng bạn không nên sử dụng dấu chấm (.) là tên chính trong MongoDB. Trong một số trường hợp, bạn có thể tạo các tài liệu như thế này, nhưng nó sẽ gây ra nhiều nhầm lẫn khi bạn cố gắng truy vấn vào tài liệu được nhúng (trong đó Mongo sử dụng dấu chấm làm dấu phân tách đường dẫn).

+0

Cảm ơn câu trả lời của bạn. Rất tiếc, tôi không có quyền kiểm soát thiết kế của các tài liệu được chèn vào bộ sưu tập:/ Ngoài ra, tôi không chắc chắn ý của bạn là gì khi bạn nói tài liệu được nhúng? Bạn có một liên kết? Đó có phải là giống như một subobject? –

+1

Tôi nghĩ rằng nó có nghĩa là giống như những gì bạn gọi là "subobject". "Tài liệu được nhúng" là một thuật ngữ tập trung nhiều dữ liệu hơn, trong khi "subobject" là một thuật ngữ tập trung hơn (đối với những ngôn ngữ mà tài liệu Mongo được thể hiện dưới dạng phân cấp các đối tượng). Nếu bạn không thể thay đổi cấu trúc của các tài liệu trong bộ sưu tập của mình, bạn có thể cân nhắc sử dụng map-reduce để viết lại chúng thành định dạng có thể truy vấn nhiều hơn (chẳng hạn như định dạng tôi đề xuất ở đây) – dcrosta

+0

Cool, cảm ơn sự trợ giúp! –

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