我有一個架構
const membershipsSchema = new Schema({
spaceId: {
type: Schema.Types.ObjectId,
ref: 'Space',
},
member: {
type: Schema.Types.ObjectId,
ref: 'User',
},
....
);
mongoose.model('Membership', membershipsSchema);
我想使用像這樣的連接陳述句
Select * from membershipPlans as plans join User as users on plans.member=users._id
where plans.spaceId=id and users.status <> 'archived'; // id is coming from function arguments
我試過aggregate像這樣的管道
const memberships = await Memberships.aggregate([
{
$match: {
spaceId: id
}
},
{
$lookup: {
from: 'User',
localField: 'member',
foreignField: '_id',
as: 'users',
},
},
{
$match: {
'users.status': {$ne: 'archived'}
}
},
]);
但是console.log(memberships);我得到一個空陣列。如果我嘗試return Memberships.find({ spaceId: id }),它會回傳該空間的已填充成員資格。但是當我嘗試
const memberships = await Memberships.aggregate([
{
$match: {
spaceId: id
}
},
]}
它仍然回傳一個空陣列。不確定我是否知道如何使用aggregate管道。
uj5u.com熱心網友回復:
您需要做兩件事:
- 投射
id到ObjectId. - 不使用
$match,只需users使用 $filter 過濾陣列的內容。
嘗試這個:
const memberships = await Memberships.aggregate([
{
$match: {
spaceId: new mongoose.Types.ObjectId(id)
}
},
{
$lookup: {
from: 'User',
localField: 'member',
foreignField: '_id',
as: 'users',
},
},
{
$project: {
users: {$filter: {
input: "$users",
as: "user",
cond: {
$ne: ["$$user.status", "archived"]
}
}}
}
},
]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/534209.html
標籤:节点.js猫鼬无服务器
