2012-05-07 24 views
9

tôi có bộ sưu tập trò chơi trong DB của tôi:MongoDB tìm một tài liệu với tất cả các tài liệu phụ đáp ứng một điều kiện

var game = { 
    players: [{username:"user1", status:"played"}, 
      {username:"user2", status:"accepted"}] 
} 

Theo như tôi hiểu truy vấn như thế này: db.games.find({"players.status":"played"}) sẽ cho tôi tất cả các trò chơi có ít nhất một cầu thủ có tư cách "chơi". Làm thế nào tôi có thể tìm thấy trò chơi với TẤT CẢ người chơi có trạng thái "đã chơi"?

+0

Dưới đây là một cuộc thảo luận với một giải pháp linh hoạt hơn: http : //stackoverflow.com/questions/11823296/mongodb-find-subdocument-in-array-matching-parameters/11823340#11823340 –

Trả lời

11

Nếu bạn chỉ có một tình trạng khác hơn là "chơi" sử dụng truy vấn:

db.games.find({ "players.status": { $ne:"accepted" } }) 

Bạn có thể điều chỉnh các truy vấn để xử lý giá trị trạng thái hơn, miễn là họ đều biết đến tại thời điểm truy vấn .

+1

Đây là cách tôi đã làm. Vẫn còn tự hỏi nếu có một cách tốt hơn, vì bây giờ tôi phải thay đổi truy vấn mỗi khi tôi thêm một trạng thái trò chơi mới. – andr111

+1

Bạn có thể làm cho truy vấn của bạn năng động - nếu bạn tạo một tập hợp tất cả các giá trị trạng thái dưới dạng mảng, hãy xóa "đã phát" khỏi nó và sử dụng nó với thao tác $ 90 (không phải trong) nó sẽ hoạt động. –

+0

Cảm ơn, tôi đoán đây là cách duy nhất tôi có thể làm điều này. – andr111

-1

Sử dụng tính năng $ Thư giãn trong những khuôn khổ hợp:

db.collection.aggregate ([{$ Thư giãn: "$ players.status"}, {$ trận đấu: { "players.status": "chơi "}, {$ dự án: {" _ id ": 0," players.status ": 1}}])

(kiểm tra câu trả lời này: https://stackoverflow.com/a/15082321/1214167)

+1

không khớp với những gì OP muốn - điều này sẽ chỉ trả về những người chơi có trạng thái "đã chơi" - vấn đề là trả lại các đội nơi tất cả người chơi đã chơi. Bạn có thể làm điều đó với tập hợp bằng cách mở rộng truy vấn để đếm số lượng người chơi đã chơi và so sánh nó với kích thước của mảng đầy đủ, nhưng điều đó phức tạp hơn và chậm hơn so với tìm đơn giản. –

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