如何查询 Mongoose $elemMatch 中的多个字段

问题描述 投票:0回答:1

我有一个数据模型,可以在我的记录中记录一系列活动,包括记录任何问题和错误:

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 查询中执行此操作。

javascript typescript mongoose nestjs
1个回答
0
投票

我不知道我是否明白你在找什么,但我明白:

我需要运行一个查询来查找没有任何活动的所有记录,这些记录的问题未被消除(即已消除的问题不存在)。

如:

我只想要

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
的值也会返回。

© www.soinside.com 2019 - 2024. All rights reserved.