Node.js 如何计算数组中包含值的文档数?

Node.js 如何计算数组中包含值的文档数?,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我有一个MongooseabTest文档,它有两个字段: 状态。这是一个字符串枚举,可以是active、inactive或draft类型 validCountryCodes。这是一个字符串枚举数组(GB、EU、AU等)。默认情况下,它将为空 在数据库中,在任何时候,我只希望每个validCountryCode都有一个活动的abTest,因此我在创建或编辑新的abTest之前执行一些验证 为此,我编写了一个函数,该函数试图统计状态为active且包含其中一个countrycode的文档数 如果计数

我有一个Mongoose
abTest
文档,它有两个字段:

  • 状态
    。这是一个字符串枚举,可以是
    active
    inactive
    draft
    类型
  • validCountryCodes
    。这是一个字符串枚举数组(
    GB
    EU
    AU
    等)。默认情况下,它将为空
  • 在数据库中,在任何时候,我只希望每个
    validCountryCode
    都有一个活动的
    abTest
    ,因此我在创建或编辑新的
    abTest
    之前执行一些验证

    为此,我编写了一个函数,该函数试图统计状态为
    active
    且包含其中一个
    countrycode
    的文档数

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

    if(参数状态=='active'){
    const activeTestForCountryExists=等待checkifactiviabletestforcountry(
    有效的国家代码,
    );
    if(params.activeTestForCountryExists){
    抛出新的ValidationError({
    消息:“每个国家/地区代码只能有一个活动测试。”,
    });
    }
    }
    const abTest=等待abTest.create(参数);
    
    checkifactiviabletestforcountry()
    如下所示:

    const checkifactiviabletestforcountry=async countrycode=>{
    常量查询={
    状态:“活动”,
    };
    如果(
    !国家代码||
    (Array.isArray(countryCodes)和&countryCodes.length==0)
    ) {
    query.validCountryCodes={
    $eq:[],
    };
    }否则{
    query.validCountryCodes={$in:[countryCodes]};
    }
    const count=wait AbTest.countDocuments(查询);
    返回计数>0;
    };
    
    count查询不仅应该计算精确的数组匹配,而且应该计算任何部分匹配

    如果数据库中有一个
    活动的
    abTest
    带有
    validCountryCodes
    数组的
    ['GB',AU',]
    ,则尝试使用
    ['GB'
    创建一个新的
    abTest
    应该失败。因为已经有一个
    GB
    作为
    validCountryCode>的测试

    类似地,如果存在使用
    validCountryCodes
    数组
    ['AU']
    的测试,则使用
    ['AU,'NZ']
    validCountryCodes
    创建测试也应失败

    目前这两项都没有强制执行

    我怎样才能做到这一点?是否可以编写一个查询来检查这一点


    我考虑过迭代
    参数.validCountryCodes
    并计算包含每个参数的文档,但这似乎是一种不好的做法。

    看看这个MongoDB

    据我所知,您需要的是确定是否有任何文档包含至少一个指定的
    countrycode
    ,并且它具有
    active
    状态。然后您的查询应该如下所示:

    {
    状态:“活动”,
    $or:[
    {validCountryCodes:countryCodes[0]},
    {validCountryCodes:countryCodes[1]},
    // ...
    ]
    }
    

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

    您使用的是符合您要求的正确mongo查询。您能否验证从应用程序执行的实际查询是否相同?请检查

    例如,以下查询:

    { status: 'active', validCountryCodes: { $in: ['GB' ] } }
    
    应匹配文件:

    { status: 'active', validCountryCodes: ['AU','GB'] }
    

    如果我这样做,那么带有
    validCountryCodes
    ['AU','GB']
    的文档将不匹配
    ['GB']
    。它应该匹配!如果您有这样的文档:
    {status:'active',validCountryCodes:['AU','GB']}
    它将匹配此查询
    {status:'active validCountryCodes:'GB'}
    `是的!但是通过
    checkifactiviabletestforcountry
    传入的参数是一个
    countrycode
    数组,因此我基本上要计算其中至少有一个公共element@judgejab我已经更新了答案,您可以使用循环来构建
    $或
    数组
    
    { status: 'active', validCountryCodes: ['AU','GB'] }