为什么$ elemMatch MongoDB查询在客户端和服务器上的行为与扩展的RexExp EJSON类型不同?

时间:2016-02-29 22:40:36

标签: javascript regex mongodb meteor coffeescript

这是一个非常专业的案例,但对于想要在Meteor中使用发布和订阅从客户端(Mini-Mongo)到服务器(MongoDB)的MongoDB RegExp驱动查找的人来说非常相关>。 我想理解为什么服务器和客户端MongoDB查询功能之间存在差异,并且如果需要A)则向Meteor开发拉取请求,并且B)对其他开发人员有益。

予。一般情况:

  1. 至少以aldeed:meteor-simple-schemaaldeed:collection2accounts-passwordejson运行Meteor安装。
  2. 使用EJSON添加RegExp类型并使用以下说明
  3. 扩展 EJSON.addTypeHow to extend EJSON to serialize RegEx for Meteor Client-Server interactions?
  4. 使用电子邮件地址"admin@foo.com"
  5. 添加Meteor.user
  6. 在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!?
    
  7. 在MongoDB shell上运行它(绕过Meteor.users):

    # mongo shell
    > db.users.find({ 'emails': { '$elemMatch': { 'address': /^adm/ } } }).count()
    # prints 1
    
  8. 尝试使用相同的数据进行独立的Mongo.Collection查找。

    # server
    MyUsers = new Mongo.Collection 'myusers'
    
  9. 将用户文档从Meteor.users()复制到MyUsers集合中。

  10. 在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!?
    
  11. 此外,如果我发布所有用户,但是对客户端代码运行 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中显示?我不知道因为......

    • EJSON已正确扩展。
    • MiniMongo正确选择并计算客户端上的记录。
    • 使用MyUser Collection(使用Mongo.Collection实例化)也无法在服务器上报告正确的计数,但在客户端上使用此查询选择器中的扩展RegExp EJSON类型成功运行{{1使用{ 'emails': { '$elemMatch': { 'address': /^adm/ } } }
    • 范围之外的相同文档

    我在哪里可以看到(并试验)Meteor源代码中Collection.find()的服务器端定义?

1 个答案:

答案 0 :(得分:0)

这看起来像一个bug。请在http://github.com/meteor/meteor/issues提交问题。请务必遵循我们的复制指南。