gpt4 book ai didi

node.js - 检查$project中是否找到子文档

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:14 24 4
gpt4 key购买 nike

我正在尝试查找一家公司提供的所有行程,并按巴士司机分组,并检查给定乘客是否属于该行程。

Content 是一个数组,可以引用多个模型:User、Cargo 等。

我可以使用以下方法达到我想要的结果:

    traveled: { $in: [ passengerId, "$content.item" ] },

但我想确认匹配的 id 确实是“用户”(乘客)。我尝试过:

    traveled: { $and: [
{ $in: [ passengerId, "$content.item" ] },
{ $in: [ `Passenger`, "$content.kind" ] },
]},

但是,当数组中存在另一个具有“User”类型的内容时,如果传递的 id 具有“Cargo”类型,它也会匹配。

    // Trip
const schema = Schema({
company: { type: Schema.Types.ObjectId, ref: 'Company', required: false },
driver: { type: Schema.Types.ObjectId, ref: 'User', required: true },
description: { type: String, required: true },
....
content: [{
kind: { type: String, required: true },
item: { type: Schema.Types.ObjectId, refPath: 'content.kind', required: true }
}]
});

const Trip = mongoose.model('Trip', schema, 'trips');

Trip.aggregate([
{ $match: { company: companyId } },
{
$project: {
_id: 1,
driver: 1,
description: 1,
traveled: { $in: [ passengerId, "$content.item" ] },
// traveled: { $and: [
// { $in: [ passengerId, "$content.item" ] },
// { $in: [ `Passenger`, "$content.kind" ] },
// ]},
}
},
{
$group : {
_id: "$driver",
content: {
$push: {
_id: "$_id",
description: "$description",
traveled: "$traveled",
}
}
},
}
]).then(console.log).catch(console.log);

最佳答案

no $elemMatch operator$project 阶段。因此,要使用模仿类似的功能,您可以创建 $filter,其中 $size$gt > 0。

类似于

"traveled":{
"$gt":[
{"$size":{
"$filter":{
"input":"$content",
"as":"c",
"cond":{
"$and":[
{"$eq":["$$c.item",passengerId]},
{"$eq":["$$c.kind","User"]}
]
}
}
}},
0
]
}

关于node.js - 检查$project中是否找到子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49435238/

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