Node.js 如何计算数组中包含值的文档数?
我有一个MongooseNode.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的文档数 如果计数
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'] }