gpt4 book ai didi

javascript - 查询依赖于 mongodb 中其他文档值的文档

转载 作者:可可西里 更新时间:2023-11-01 10:02:13 26 4
gpt4 key购买 nike

想象一下 Mongoose 模型:

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

获取所有与具有特定 _id 的用户的 blockedId 不匹配的用户的最有效方法是什么?

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

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

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

最佳答案

尝试 non-correlated 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”不在 blockedIds 列表中的文档。

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

$arrayElemAt从 $lookup 数组中获取第一个元素。

$in将 _id 与 blockedIds 进行比较。

$project排除从最终响应中删除“noncr”字段。

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

关于javascript - 查询依赖于 mongodb 中其他文档值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47886602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com