Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何按模式查找但排除条件列表_Javascript_Node.js_Mongodb_Mongodb Query - Fatal编程技术网

Javascript 如何按模式查找但排除条件列表

Javascript 如何按模式查找但排除条件列表,javascript,node.js,mongodb,mongodb-query,Javascript,Node.js,Mongodb,Mongodb Query,嗨,我有点被Mongo/Mongoose查询卡住了,我需要帮助 我有一个名为friends的对象数组(例如创建假数据): 朋友们: [ {username: "Anders", age: 10}, {username: "Bella", age: 21}, {username: "Debbie", age: 22} ] 我还想在Mongo中查询一个名为people的表: 人民: [ {username: "Anders", age: 10},

嗨,我有点被Mongo/Mongoose查询卡住了,我需要帮助

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

朋友们:

[
   {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”开头的人那里检索所有文档,但不包括出现在friends数组中的文档。我不想搜索所有用户名以“An”开头的文档,然后再过滤掉,因为我的数据库相当大。

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

var-friends=[
{用户名:“安德斯”,年龄:10},
{用户名:“贝拉”,年龄:21},
{用户名:“黛比”,年龄:22}
];
var query={“$nor”:friends,“username”:{“$regex”:“^An”};

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

与@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']})
这种方法有几个优点

  • 您不需要为每种类型的人都创建一个集合,这样就更容易对所有人进行聚合和查询
  • 添加新类型(亲戚、同事)不会使您创建新的集合和索引
  • 它减少了冗余和开销
  • 对于这个特殊的用例,它将减少您的查询数量,因为您不必将所有人从
    朋友
    加载到一个数组中,并在第二个查询中排除它们