这是一个非常专业的案例,但对于想要在Meteor中使用发布和订阅从客户端(Mini-Mongo)到服务器(MongoDB)的MongoDB RegExp
驱动查找的人来说非常相关>。 我想理解为什么服务器和客户端MongoDB查询功能之间存在差异,并且如果需要A)则向Meteor开发拉取请求,并且B)对其他开发人员有益。
予。一般情况:
aldeed:meteor-simple-schema
,aldeed:collection2
,accounts-password
和ejson
运行Meteor安装。EJSON
添加RegExp
类型并使用以下说明EJSON.addType
:How to extend EJSON to serialize RegEx for Meteor Client-Server interactions? "admin@foo.com"
在Meteor服务器代码(意外结果)上运行:
# anywhere on the server
if Meteor.isServer
user_selector = { 'emails': { '$elemMatch': { 'address': /^adm/ } } }
user_count = Meteor.users.find(user_selector).count()
console.log user_count
# prints 0 WHY!?
在MongoDB shell上运行它(绕过Meteor.users):
# mongo shell
> db.users.find({ 'emails': { '$elemMatch': { 'address': /^adm/ } } }).count()
# prints 1
尝试使用相同的数据进行独立的Mongo.Collection查找。
# server
MyUsers = new Mongo.Collection 'myusers'
将用户文档从Meteor.users()复制到MyUsers集合中。
在Meteor服务器上运行(也是未预期的):
# anywhere on the server
if Meteor.isServer
user_selector = { 'emails': { '$elemMatch': { 'address': /^adm/ } } }
user_count = MyUsers.find(user_selector).count()
console.log user_count
# prints 0 WHY!?
此外,如果我发布所有用户,但是对客户端代码运行 exact 相同的查询(例如在模板助手参数内),则查询返回预期的计数。
II。发布/订阅模板帮手案例:
发布和订阅用户。
# Server
Meteor.publish 'all_users', ->
return Meteor.users.find({})
# Client
Template.people.onCreated ->
self = @
self.peopleReady = new ReactiveVar()
self.autorun ->
users = Meteor.subscribe 'all_users'
self.peopleReady.set users.ready()
Template.people.helpers
user_count: ->
user_selector = { 'emails': { '$elemMatch': { 'address': /^adm/ } } }
user_count = Meteor.users.find(user_selector).count()
console.log user_count
# prints 1
return user_count
为什么服务器代码的差异在上面的I.4中显示?我不知道因为......
{ 'emails': { '$elemMatch': { 'address': /^adm/ } } }
我在哪里可以看到(并试验)Meteor源代码中Collection.find()的服务器端定义?