2011-12-20 69 views
6

Tôi có một tài liệu Mongo được cấu trúc theo cách sau:Truy vấn lồng nhau Danh sách tồn tại trong Mongo

{ 
    "_id" : ObjectId("4eea7237d0ba3a04f20008fb"), 
    "code" : "b2677c2809c844cc9d7e3e4ff8d95b46", 
    "city_id" : 4, 
    "datetime" : ISODate("2011-12-13T18:41:44.062Z"), 
    "plays" : [  
     { 
      "play_id" : 717224, 
      "clicks" : [ ], 
      "order" : 1, 
      "mysql_id" : 145 
     } 

tôi muốn truy vấn cho tài liệu mà plays.clicks thuộc tính là một danh sách không có sản phẩm nào. Tôi đã cố gắng tồn tại mà không có may mắn. Tôi nghĩ rằng một cái gì đó như thế này có thể làm việc:

db.collection.find({plays.clicks.0: {$exists:true}}) 

Nhưng tôi tin rằng điều này sẽ chỉ trả lại tài liệu có phần tử đầu tiên trong mảng phát chứa danh sách nhấp chuột không trống.

Bất kỳ suy nghĩ nào về cách tôi có thể thực hiện việc này?

Cảm ơn

Trả lời

7

db.collection.find({plays.clicks.0: {$exists:true}})

là quyền cú pháp, tuy nhiên là plays là danh sách truy vấn sẽ khớp với bất kỳ tài liệu nào có số nhấp chuột trong plays. Không có cách nào để lấy ra một tập hợp con của một mảng cho các phần tử con theo cách này [1]. Có một vé cho phụ/bộ sưu tập ảo [2]

[1] http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

[2] https://jira.mongodb.org/browse/SERVER-828

+0

Cảm ơn Ross, đây có lẽ là câu trả lời hay nhất (mặc dù đề xuất chuẩn hóa bổ sung là một giải pháp thay thế hợp lý). – Ben

3

Lưu kích thước của danh sách như một thuộc tính riêng biệt (ví dụ num_plays). Sau đó, bạn có thể truy vấn cho các tài liệu nơi num_plays lớn hơn 0:

+0

tôi có thể làm điều này. Từ quan điểm đọc, điều này có thể cho phép truy vấn nhanh nhất. – Ben

0

đã không được thử nghiệm, nhưng tôi nghĩ rằng các truy vấn mà bạn muốn là

{ "plays.clicks" : { "$size" : 0 } } 

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

+0

Vâng, điều đó sẽ ổn nếu tôi muốn trả lại tất cả các tài liệu có kích thước danh sách là 0. Thật không may, tôi muốn sự ngược lại và điều đó dường như không thể. – Ben

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