查询依赖于mongodb中其他文档的值的文档 [英] query documents that depend on values of other documents in mongodb

查看:72
本文介绍了查询依赖于mongodb中其他文档的值的文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想象下面的猫鼬模型:

const UserSchema = Schema({
  //_id: ObjectId,
  //more fields,
  blockedIds: [{
    type: ObjectId,
    ref: 'User'
  }]
})

获取与某个_id的用户的blockId不匹配的所有用户的最有效方法是什么?

What is the most efficient way to get all users that don't match the blockedIds of an user with a certain _id?

天真的方法是执行两个查询:

A naive way would be to to perform two queries:

User.findById(id).then(user => {
  return User.find({_id: {$nin: user.blockedIds}})
})

是否可以使用聚合框架和$ facets在一个查询中完成该操作?

Is it possible to use the aggregation framework and $facets to accomplish that in one query?

推荐答案

尝试针对您的用例的3.6不相关子查询.

类似

User.aggregate(
 [{$lookup:{
   from: "users",
   pipeline:[
    {$match: {_id:mongoose.Types.ObjectId(id)}},
    {$project: {_id:0,blockedIds:1}}
   ],
   as: "noncr"
 }},
 {$match:{
   $expr:{
     $not:[
      {$in:[
        $_id,
        {$arrayElemAt:["$noncr.blockedIds",0]}
      ]}
    ]
  }
}},
{$project:{noncr:0}}]
)

$lookup 将输入id的"blockedIds"后跟 $match 过滤"_id"不在被阻止的ID列表中的文档.

$lookup to pull in the "blockedIds" for input id followed by $match to filter the documents where "_id" is not in list of blockedIds.

$expr 允许使用聚合$ match阶段的比较运算符.

$expr allows use of aggregation comparison operators in $match stage.

$arrayElemAt 来获取第一个$ lookup数组中的元素.

$arrayElemAt to fetch the first element from $lookup array.

$in 比较_id针对blockedIds.

$in to compare the _id against blockedIds.

$project (排除可删除)最终回复中的"noncr"字段.

$project with exclusion to remove the "noncr" field from the final response.

请注意,当您测试查询时,请在查找阶段的来自"属性中使用集合名称而不是模型或架构名称.

Please note when you test query use the collection name not model or schema name in "from" attribute of look up stage.

这篇关于查询依赖于mongodb中其他文档的值的文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆