【问题标题】:How to find by pattern but exclude a list of condtions如何按模式查找但排除条件列表
【发布时间】:2014-11-07 21:16:20
【问题描述】:

您好,我对 Mongo/Mongoose 查询有点困惑,需要帮助。

我有一个名为朋友的对象数组(例如创建的假数据):

朋友:

[
   {username: "Anders", age: 10}, 
   {username: "Bella", age: 21}, 
   {username: "Debbie", age: 22}
]

我在 Mongo 中还有一个表,我想查询名为 people 的表:

人:

   [
      {username: "Anders", age: 10}, 
      {username: "Andrew", age: 20}, 
      {username: "Annmarie", age: 28}, 
      {username: "Bella", age: 21},
      {username: "Carl", age: 40}, 
      {username: "Debbie", age: 22}
   ]

我的问题是我想从用户名以“An”开头的人那里检索所有文档,但排除出现在朋友数组中的文档。我不想搜索所有用户名以“An”开头的文档,然后过滤掉,因为我的数据库很大。

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query


    【解决方案1】:

    有一个$nor 运算符,您可以将其应用于您的朋友列表,以确保将所有人都排除在结果之外。另一部分是一个简单的$regex 运算符来匹配以“An”开头的名称:

    var friends = [
       {username: "Anders", age: 10}, 
       {username: "Bella", age: 21}, 
       {username: "Debbie", age: 22}
    ];
    
    var query = { "$nor": friends, "username": { "$regex": "^An" } };
    

    您在这里最有效的索引显然是“用户名”和“年龄”,请注意,在此处锚定“正则表达式”是唯一对您有效的方法。

    【讨论】:

      【解决方案2】:

      与@NeilLunn 提到的方法不同的方法可能是重构数据以包含所有人并区分他们与字段的关系,例如

         {username: "Anders", age: 10, tags: ['friend']}, 
         {username: "Andrew", age: 20}, 
         {username: "Annmarie", age: 28}, 
         {username: "Bella", age: 21, tags : ['friend']},
         {username: "Carl", age: 40}, 
         {username: "Debbie", age: 22, tags : ['friend']}
      

      然后做一个类似

      的查询
      db.people.find({username:{$regex:"^An"},tags:{$nin:['friends']})
      

      这种方法有几个优点

      1. 您不需要为每种类型的人收集一个集合,从而使有关所有人的聚合和查询变得更加容易
      2. 添加新类型(亲戚、同事)不会让您创建新集合并根据索引
      3. 它减少了冗余和开销。
      4. 对于这个特殊用例,它会减少您的查询数量,因为您不必将每个人从 friends 加载到一个数组并在第二个查询中排除它们。

      【讨论】:

        猜你喜欢
        • 2014-04-28
        • 2011-03-01
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多