2013-10-30 21 views
19

Trong ứng dụng meteor.js của tôi, tôi đang cố viết một trang quản trị đơn giản có thể tìm thấy người dùng theo địa chỉ email của anh ấy/cô ấy.meteor.js: tìm người dùng qua email

Tôi có thể thấy rằng trong bộ sưu tập Meteor.users có một mảng 'email', trong đó có đối tượng như vậy

{ address : '[email protected]', 
    verified : false 
} 

Thông thường trong MongoDB Tôi có thể tìm kiếm trong mảng 'email' này như sau:

Meteor.users.find({ emails.address : '[email protected]' }); 

Nhưng truy vấn này là ném một lỗi:

While building the application: 
client/admin.js:224:41: Unexpected token . 

Aka Meteor không thích ne truy vấn bị chặn ...

Bất kỳ ý tưởng nào về cách truy vấn bộ sưu tập Meteor.users theo địa chỉ email?

Trả lời

25

Nếu trên máy chủ, Meteor có chức năng đặc biệt cho việc này: Accounts.findUserByEmail(email).

Tôi tin rằng đây là cách được khuyến nghị.

18

Email giữ một loạt email. Mỗi email có một địa chỉ.

Hãy thử { emails: { $elemMatch: { address: "[email protected]" } } }.

Thông tin trên $elemMatchhere.

Thông tin về email dưới dạng mảng là here.

+3

cảm ơn! điều này làm việc hoàn hảo. lạ các tài liệu nói rõ ràng rằng $ elemMatch không có sẵn trên máy khách ... – Petrov

2

Một workaround có thể, nếu điều này hoạt động trên máy chủ nhưng không phải là khách hàng, là sử dụng một phương pháp users_by_email trên máy chủ:

if (Meteor.isServer) { 
    Meteor.methods({ 
     'get_users_by_email': function(email) { 
      return Users.find({ emails.address: email }).fetch(); 
     } 
    }); 
} 
if (Meteor.isClient) { 
    foo_users = Meteor.call('get_users_by_email', '[email protected]'); 
} 
+0

Đừng quên đặt đối tượng email trên báo giá – Liko

53

Bạn cũng có thể sử dụng những gì bạn đã có, chỉ cần đặt nó trong dấu ngoặc kép:

Meteor.users.find({ "emails.address" : '[email protected]' }); 
+5

Bạn có thể sử dụng 'Meteor.users.findOne', bởi vì chúng tôi đang tìm kiếm một người dùng duy nhất. – cutemachine

+0

Có thể đáng lưu ý rằng 'Accounts.findUserByEmail (email) của Meteor làm cho một điểm cần lưu ý khi có nhiều email khớp với một địa chỉ email được cung cấp. Tôi không biết làm thế nào có thể, ngoại trừ dị tật cơ sở dữ liệu nghiêm trọng, nhưng Meteor có vẻ nghĩ rằng đó là một trường hợp sử dụng đủ quan trọng để xem. https://docs.meteor.com/api/passwords.html#Accounts-findUserByEmail –

3

Theo mặc định, Meteor chỉ xuất bản người dùng đã đăng nhập và bạn có thể, chạy truy vấn với người dùng đó. Để truy cập vào những người sử dụng khác mà bạn có để xuất bản chúng trên máy chủ:

Meteor.publish("allUsers", function() { 
    return Meteor.users.find({}); 
}); 

Và đăng ký với họ trên máy khách:

Meteor.subscribe('allUsers'); 

Và hãy chạy lệnh sau

Meteor.users.find({"emails": "[email protected]"}).fetch() 

HOẶC

Meteor.users.find({"emails.0": "[email protected]"}).fetch() 

Refer this

+1

Tôi đã dành quá nhiều thời gian để tìm hiểu điều gì đang diễn ra. Tôi có phải là một tên ngốc hay là nó thực sự không rõ ràng? –

+1

Và xin lỗi vì không rõ ràng - Tôi có nghĩa là "Meteor chỉ xuất bản người dùng đã đăng nhập và bạn có thể" - dường như thực sự gây nhầm lẫn khi đặt tên cho một cái gì đó là "Meteor.users' và không bao giờ trả lại nhiều hơn người dùng đã đăng nhập. –

3

Nếu bạn muốn tìm tất cả các email trong mảng tài khoản, và làm một truy vấn không nhạy cảm:

const hasUser = Meteor.users.findOne({ 
    emails: { 
     $elemMatch: { 
     address: { 
      $regex : new RegExp(doc.email, "i") 
     } 
     } 
    } 
}); 
Các vấn đề liên quan