2012-04-09 34 views
7

Tôi có một schema tương tự nhưMongo db truy vấn giá trị mảng với hơn và ít hơn

{ 
    'user_id' : 1, 
    'marks' : [10, 40] 
} 

Tôi muốn tìm số lượng người dùng đã ghi dấu giữa 20 và 30 ít nhất một lần.

Tôi đã thử các truy vấn sau đây

db.users.count({ 
    'marks' : {$gte: '20', $lt: '30'} 
}) 

Nhưng điều này cũng bao gồm những người có dấu hơn 30 ...

+0

chính xác trùng lặp với http://stackoverflow.com/questions/6038818/mongodb-query-to-match-each-element-in-doc-array-to-a-condition – Nat

+0

cảm ơn, tôi đã tìm những câu hỏi tương tự nhưng không thể tìm thấy câu hỏi ... – Rishabh

+2

thực sự trong truy vấn của bạn, bạn đang sử dụng chuỗi thay vì số. – cantdutchthis

Trả lời

1

Vì vậy, giả sử bạn có dữ liệu sau trong điểm bộ sưu tập:

{ 'user_id' : 1, 'marks' : [ 10, 40 ] } 
{ 'user_id' : 2, 'marks' : [ 5, 18 ] } 
{ 'user_id' : 3, 'marks' : [ 15, 25 ] } 
{ 'user_id' : 4, 'marks' : [ 22, 33 ] } 

Sau đó, bạn sẽ mong đợi để lọc user_ids 3 và 4, một số 2.

Cách đơn giản nhất để chạy truy vấn của bạn là để làm:

db.scores.count({'marks':{$in: [20,21,22,23,24,25,26,27,28,29,30]}}) 

Nhưng không đẹp ...

+0

yeah đã nghĩ đến việc không làm điều đó. sẽ chấp nhận điều này vì dường như không có tùy chọn khác – Rishabh

4

Không phải là nó chỉ này:

db.scores.count({ 'marks' : { '$gt' : min_value , '$lt' : max_value } }) 

Mà trong trường hợp của bạn sẽ dịch để:

db.scores.count({ 'marks' : { '$gt' : 20 , '$lt' : 30 } }) 
+1

nopes, trong trường hợp này, tập dữ liệu [10,40] được chọn là – Rishabh

16

Sử dụng $elemMatch để hạn chế cả hai phần của truy vấn phạm vi vào sam emarks yếu tố:

db.users.count({ 
    marks: {$elemMatch: {$gte: 20, $lt: 30}} 
}) 
Các vấn đề liên quan