mongodb - 具有多个条件的聚合和项目
问题描述
我有一个包含成员数组的 myCollection 集合:
{
name : String,
members: [{status : Number, memberId : {type: Schema.Types.ObjectId, ref: 'members'}]
}
我有这个数据
"_id" : ObjectId("5e83791eb49ab07a48e0282b")
"members" : [
{
"status" : 1,
"_id" : ObjectId("5e83791eb49ab07a48e0282c"),
"memberId" : ObjectId("5e7dbf5b257e6b18a62f2da9")
},
{
"status" : 2,
"_id" : ObjectId("5e837944b49ab07a48e0282d"),
"memberId" : ObjectId("5e7de2dbe027f43adf678db8")
}
],
我想通过聚合查询检查成员是否5e7dbf5b257e6b18a62f2da9
存在status 1
但它没有返回 true
db.getCollection('myCollection').aggregate([
{$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
{
$project: {
isMember: {
$cond: [
{ $and: [ {$in: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$members.memberId']}, {$eq: ['$members.status', 1]} ] },
// if
true, // then
false // else
]
}
}
}
])
谢谢你的回复。
解决方案
如果你想得到只是true/false
你可以这样的快捷方式:
db.collection.aggregate([
{ $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
{
$project: {
isMember: {
$map: {
input: "$members",
in: {
$and: [
{ $eq: [ObjectId("5e7dbf5b257e6b18a62f2da9"), '$$this.memberId'] },
{ $eq: [1, '$$this.status'] }
]
}
}
}
}
},
{ $set: { isMember: { $anyElementTrue: "$isMember" } } }
])
一种不同的风格是这样的:
db.collection.aggregate([
{ $match: { _id: ObjectId("5e83791eb49ab07a48e0282b") } },
{
$project: {
isMember: {
$map: {
input: "$members",
in: {
$eq: [
{ memberId: ("5e7dbf5b257e6b18a62f2da9"), status: 1 },
{ memberId: "$$this.memberId", status: "$$this.status" }
]
}
}
}
}
},
{ $set: { isMember: { $anyElementTrue: "$isMember" } } }
])
推荐阅读
- sql - 使用 CASE 表达式时如何解决此查询中的错误?
- delphi - Delphi 10.3(32 位)社区版访问 PostgreSQL 11,使用 FireDac 驱动程序的 64 位版
- android - 运行我的 Flutter 项目时,我的 Flutter 项目中出现 AndroidX 不兼容问题
- react-native - 与 Expo 项目在 React 中广播
- python - 如何使用 python 2.7 完成基本身份验证?
- php - Yii2,为什么当该属性由行为分配时,由于缺少强制属性而导致模型验证失败?
- c# - 实体框架在加载时抛出异常
- javascript - 如何通过 Gmail API 和 Google Apps 脚本请求和发送付款
- java - 从 Spring Boot 开始持续使用 REST Web 服务
- typescript - TypeScript类型检查问题,一个字符串被压入一个数字数组