我有一个数据模型,可以在我的记录中记录一系列活动,包括记录任何问题和错误:
activities?: {
message?: string;
data?: any;
issue?: {
errors?: AVError[];
dismissed?: {
timestamp: string;
message?: string;
};
}
}[];
我需要运行一个查询来查找没有任何活动且问题未消除的所有记录(即
dismissed
不存在)。
我尝试过的一切似乎都在某些方面失败了。这是我最近尝试过的查询:
collection.find({
activities: {
$not: {
$elemMatch: {
issue: { $exists: true },
'issue.dismissed': { $exists: false },
},
},
},
});
当问题不存在或问题不存在时,这可以工作,但它似乎仍然无法识别问题何时存在。
我也尝试过这个:
collection.find({
$or: [
{ 'activities.issue': { $exists: false } },
{
'activities.issue': { $exists: true },
'activities.issue.dismissed': { $exists: true },
},
],
});
但这也没有返回一些被驳回的记录。
作为一种解决方法,我可以返回所有数据,然后手动过滤数据,但我希望有一种方法可以在一个 Mongoose 查询中执行此操作。
我不知道我是否明白你在找什么,但我明白:
我需要运行一个查询来查找没有任何活动的所有记录,这些记录的问题未被消除(即已消除的问题不存在)。
如:
我只想要
中的所有值都有activities
的元素。issue
因此,“没有任何活动的问题未被消除”就像“没有任何活动的问题未解决”,因此“所有返回的活动都已消除所有问题”。
所以我认为你的查询几乎就是你想要的。我已经尝试过这个查询并且符合我的理解:
db.collection.find({
"activities": {
$not: {
$elemMatch: {
"issue.dismissed": {
$exists: false
}
}
}
}
})
示例此处。
在此示例中,我添加了五个文档,唯一返回的是所有
activities
都有 issue
的文档。并且还返回没有 activities
的元素,因为我认为您想要在 { 'activities.issue': { $exists: false } },
查询中使用 $or
。顺便说一句,如果您不想要该值,请尝试使用此查询。
与您的查询的区别在于您添加了
issue: { $exists: true },
,因此带有 activities
但不带 issues
的值也会返回。