2012-05-22 74 views
13

Có cách nào để tìm kiếm một cột trong bộ sưu tập trong mongodb với $ trong đó bao gồm một mảng các phần tử cho tìm kiếm và cũng khớp với các đối tượng trong cột không?

+0

Ngoài toán tử $ in, đây là bản sao của http://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case-insensitive-query –

+0

Ya đúng. câu hỏi của tôi về cơ bản liên quan đến trường hợp caseinsensitive với $ trong toán tử. –

Trả lời

6

Bạn có thể sử dụng $ elemMatch với tìm kiếm biểu thức chính quy, ví dụ: chúng ta hãy tìm kiếm cho "xanh" màu trong bộ sưu tập sau:

db.items.save({ name : 'a toy', colors : ['red', 'BLUE'] }) 
> ok 
db.items.find({ 'colors' : 
        { $elemMatch : 
         { $regex : 'blue', $options : 'i' } 
        } 
       }) 
>[ 
    { "name" : "someitem", "_id" : { "$oid" : "4fbb7809cc93742e0d073aef" }, "colors" : [ "red", "BLUE" ] } 
] 
+2

Một lưu ý: regex này sẽ không sử dụng chỉ mục. Vì vậy, giải pháp như vậy không phù hợp cho 'dữ liệu lớn'. Một giải pháp khác là hỗ trợ cùng một mảng thấp hơn. –

+0

Thật vậy. Cảm ơn bạn đã đề cập đến điều đó. –

+1

điều này không hữu ích khi chúng ta cần kiểm tra một mảng giá trị –

0

Đây là case insensitive tìm kiếm của tôi (query) với nhiều điều kiện (regex) từ dữ liệu của mảng, tôi đã sử dụng $in nhưng nó không hỗ trợ tìm kiếm phân biệt chữ hoa chữ thường.

Ví dụ dữ liệu

{ 
    name : "...Event A", 
    tags : ["tag1", "tag2", "tag3", "tag4] 
}, 
{ 
    name : "...Event B", 
    tags : ["tag3", "tag2"] 
}, 
{ 
    name : "...Event C", 
    tags : ["tag1", "tag4"] 
}, 
{ 
    name : "...Event D", 
    tags : ["tag2", "tag4"] 
} 

truy vấn của tôi

db.event.find(
    { $or: //use $and or $or depends on your needs 
    [ 
     { tags : { 
     $elemMatch : { $regex : '^tag1$', $options : 'i' } 
     } 
     }, 
     { tags : { 
     $elemMatch : { $regex : '^tag3$', $options : 'i' } 
     } 
     } 
    ] 
}) 
4

Sử dụng $in với trận đấu là trường hợp nhạy cảm:

dữ liệu Ví dụ:

{ 
    name : "...Event A", 
    fieldX : "aAa" 
}, 
{ 
    name : "...Event B", 
    fieldX : "Bab" 
}, 
{ 
    name : "...Event C", 
    fieldX : "ccC" 
}, 
{ 
    name : "...Event D", 
    fieldX : "dDd" 
} 

Và chúng tôi muốn docu các tuyên bố là "fieldX" được chứa trong bất kỳ giá trị của mảng (optValues):

var optValues = ['aaa', 'bbb', 'ccc', 'ddd']; 

var optRegexp = []; 
optValues.forEach(function(opt){ 
     optRegexp.push( new RegExp(opt, "i")); 
}); 

db.collection.find({ fieldX: { $in: optRegexp } }); 

này làm việc cho $all một trong hai.

Tôi hy vọng điều này sẽ hữu ích!

p.s .: Đây là giải pháp của tôi để tìm kiếm theo thẻ trong ứng dụng web.

+0

làm việc cho Ruby cũng như nhờ .. chỉ cần sử dụng 'Regexp.new (opt, Regexp :: IGNORECASE)' thay cho 'new RegExp (tag, "i") ' –

1

này làm việc cho tôi một cách hoàn hảo: Từ mã chúng tôi có thể tạo truy vấn tùy chỉnh như thế này:

{"first_name":{"$in":[{"$regex":"^serina$","$options":"i"},{"$regex":"^andreW$","$options":"i"}]}} 

này sẽ làm thay đổi đến sau trong Mongo sau khi truy vấn:

db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}}) 

Tương tự cho "$ nin ".

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