首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算数组中包含值的文档?

如何计算数组中包含值的文档?
EN

Stack Overflow用户
提问于 2020-09-16 15:06:46
回答 2查看 110关注 0票数 0

我有一个猫鼬abTest文档,其中有两个字段:

  1. status。这是一个字符串枚举,可以是activeinactivedraft类型。
  2. validCountryCodes。这是字符串枚举的数组(GBEUAU等)。默认情况下,它将为空。

在DB中,在任何时候,我只希望每个validCountryCode都有一个活动的abTest,所以在创建或编辑新的abTest之前,我要执行一些验证。

为此,我编写了一个函数,试图计算具有status of active并包含countryCodes之一的文档数量。

如果计数超过一个,则函数将返回。如果是这样,我将抛出一个验证错误。

代码语言:javascript
复制
if (params.status === 'active') {
  const activeTestForCountryExists = await checkIfActiveAbTestForCountry(
    validCountryCodes,
  );
  if (params.activeTestForCountryExists) {
    throw new ValidationError({
      message: 'There can only be one active test for each country code.',
    });
  }
}

const abTest = await AbTest.create(params);

checkIfActiveAbTestForCountry()看起来是这样的:

代码语言:javascript
复制
const checkIfActiveAbTestForCountry = async countryCodes => {
  const query = {
    status: 'active',
  };

  if (
    !countryCodes ||
    (Array.isArray(countryCodes) && countryCodes.length === 0)
  ) {
    query.validCountryCodes = {
      $eq: [],
    };
  } else {
    query.validCountryCodes = { $in: [countryCodes] };
  }

  const count = await AbTest.countDocuments(query);
  return count > 0;
};

count查询不仅应该计算精确的数组匹配,还应该对任何部分匹配进行计数。

如果在DB中有一个active abTest和一个validCountryCodes数组的['GB', 'AU',],那么使用['GB'创建新abTest的尝试就会失败。因为GB作为validCountryCode已经有了一个测试。

类似地,如果有validCountryCodes数组的['AU']测试,那么用validCountryCodes of ['AU,'NZ']创建测试也会失败。

现在这两件事都没有强制执行。

我该怎么做?这是否有可能编写一个检查此查询的查询?

我考虑过迭代params.validCountryCodes并计算包含每个文档的文档,但这似乎是错误的做法。

EN

回答 2

Stack Overflow用户

发布于 2020-09-16 16:09:17

看看这个MongoDB 文献记录

正如我所理解的,您需要了解的是,是否有任何文档至少包含一个指定的countryCodes,并且它具有active状态。那么您的查询应该如下所示:

代码语言:javascript
复制
{ 
  status: 'active',
  $or: [
    { validCountryCodes: countryCodes[0] },
    { validCountryCodes: countryCodes[1] },
    // ...
  ]
}

请注意,计数文档并不是检查文档是否存在的有效方法,而是使用findOne,只投影一个字段。

票数 0
EN

Stack Overflow用户

发布于 2020-09-18 11:33:41

您正在为您的需求使用正确的mongo查询。您能验证从应用程序执行的实际查询是否相同吗?检查这里

代码语言:javascript
复制
{ status: 'active', validCountryCodes: { $in: [ countryCodes ] } }

以下查询:

代码语言:javascript
复制
{ status: 'active', validCountryCodes: { $in: ['GB' ] } }

应与文件相匹配:

代码语言:javascript
复制
{ status: 'active', validCountryCodes: ['AU','GB'] }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63922942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档