2012-03-22 58 views
69

Tôi thích tìm người dùng trong mongoDb bằng cách tìm kiếm người dùng được gọi là giá trị. Vấn đề với:Mongoose.js: Tìm người dùng theo tên người dùng Giá trị LIKE

username: 'peter' 

là tôi không tìm thấy nó nếu username là "Peter", hoặc "Peter" .. hoặc một cái gì đó như thế.

Vì vậy, tôi muốn làm như sql

SELECT * FROM users WHERE username LIKE 'peter' 

Hope you guys có được những gì im Askin cho?

ngắn: 'lĩnh vực giá trị LIKE' trong mongoose.js/MongoDB

+1

Chỉ cần một sang một bên, truy vấn SQL sẽ không tìm thấy 'Peter' hoặc 'PeTER' hoặc là' LIKE' không phải là case-insensitive. – beny23

+7

lý do tại sao downvote một comer mới? – Mustafa

Trả lời

116

Vâng. Chỉ cần cho những người đang lookin cho câu trả lời tôi đã được tôi đã làm như thế này

var name = 'Peter'; 
model.findOne({name: new RegExp('^'+name+'$', "i")}, function(err, doc) { 
    //Do your action here.. 
}); 
+1

đối số "i" nghĩa là gì? Nó có liên quan gì đến trường hợp nhạy cảm không? – AzaFromKaza

+2

"i" là một đối số để chọn cờ tìm kiếm. "i" sau đó là dành cho trường hợp-insensitive. Bạn có thể đọc thêm về nó ở đây. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions – PeterBechP

+9

Điều này giả định regex không hợp lệ. Ví dụ: nếu bạn thêm "[" làm tên người dùng, sẽ ném ngoại lệ. Chỉ cần đảm bảo bạn đang thử hoặc bắt đầu nhập lại trước và kiểm tra [^ a-zA-Z0-9] rồi không tiếp tục. Trong trường hợp này, đầu vào thử nghiệm của nó chỉ có ý nghĩa. –

12

Bạn nên sử dụng một regex cho điều đó.

db.users.find({name: /peter/i}); 

Hãy cảnh giác rằng truy vấn này không sử dụng chỉ mục.

+0

Cảm ơn bạn đã trả lời nhanh! :) – PeterBechP

13
collection.findOne({ 
    username: /peter/i 
}, function (err, user) { 
    assert(/peter/i.test(user.username)) 
}) 
+0

nếu giá trị là một var thì sao? Làm thế nào để thiết lập điều đó?/varhere/i? – PeterBechP

+0

@PeterBechP xây dựng một biểu thức chính quy: \ 'mới RegExp (var, "i") ' – Raynos

+0

hoạt động tốt .. bây giờ tôi có một vấn đề .. Nó chỉ phải tìm peter nếu var là peter. Nhưng nếu tôi đặt var thành 'p' nó vẫn sẽ tìm thấy peter. – PeterBechP

54

Tôi gặp sự cố với điều này gần đây, tôi sử dụng mã này và hoạt động tốt cho tôi.

var data = 'Peter'; 

db.User.find({'name' : new RegExp(data, 'i')}, function(err, docs){ 
    cb(docs); 
}); 

Sử dụng trực tiếp /Peter/i làm việc, nhưng tôi sử dụng '/'+data+'/i' và không làm việc cho tôi.

+0

Vâng, tôi đã thử nó một lần nữa. Tôi thấy nó cũng tìm thấy nếu tôi chỉ viết P ?? hmmm – PeterBechP

+0

Có, tôi sử dụng cho các kiến ​​nghị ajax để tìm kiếm người dùng. Bạn có thể sửa đổi RegExp. – Donflopez

10
router.route('/product/name/:name') 
.get(function(req, res) { 

    var regex = new RegExp(req.params.name, "i") 
    , query = { description: regex }; 

    Product.find(query, function(err, products) { 
     if (err) { 
      res.json(err); 
     } 

     res.json(products); 
    }); 

}); 
5

Ở đây mã của tôi với expressJS:

router.route('/wordslike/:word') 
    .get(function(request, response) { 
      var word = request.params.word;  
      Word.find({'sentence' : new RegExp(word, 'i')}, function(err, words){ 
       if (err) {response.send(err);} 
       response.json(words); 
      }); 
     }); 
3

mongoose doc cho find. mongodb doc cho regex.

var Person = mongoose.model('Person', yourSchema); 
// find each person with a name contains 'Ghost' 
Person.findOne({ "name" : { $regex: /Ghost/, $options: 'i' } }, 
    function (err, person) { 
      if (err) return handleError(err); 
      console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation); 
}); 

Lưu ý đối số đầu tiên chúng tôi chuyển tới hàm mongoose.findOne. "{" name ": {$ regex:/Ghost /, $ options: 'i'}}". "name" là trường của tài liệu bạn đang tìm kiếm. "Ghost" là biểu thức chính quy. "i" dành cho trường hợp không khớp. Hy vọng điều này sẽ giúp bạn.

+0

các tùy chọn $ là gì – kabuto178

1

nếu tôi muốn truy vấn tất cả kỷ lục tại một số điều kiện, tôi có thể sử dụng này:

if (userId == 'admin') 
    userId = {'$regex': '.*.*'}; 
User.where('status', 1).where('creator', userId); 
4

Các truy vấn sau đây sẽ tìm thấy những tài liệu với chuỗi cần trường hợp insensitively và với xuất toàn cầu cũng

var name = 'Peter'; 
    db.User.find({name:{ 
         $regex: new RegExp(name, "ig") 
        } 
       },function(err, doc) { 
            //Your code here... 
       }); 
4

Đây là những gì tôi đang sử dụng.

module.exports.getBookByName = function(name,callback){ 
    var query = { 
      name: {$regex : name} 
    } 
    User.find(query,callback); 
} 
4
db.users.find({ 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } }) 
Các vấn đề liên quan