如何在NodeJs中使用$or查询嵌套数组的嵌套MongoDB?

3
我正在尝试查询MongoDB集合,以获取并匹配特定的日期范围和特定的ID数组,如branchIds或servicesIds。
如果查询找到结果,我希望返回该结果,以便通过特定用户验证请求在该集合中是否已经存在。
但是,每当我将数组值传递给查询的$or [{}]段时,使用$all时不会返回任何结果。
我做错了什么?
下面的代码可以工作并检索文档:
 db.collection("requests")
                    .find({'filter.dateRange.from': {$eq: moment(from, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
                        'filter.dateRange.to': {$eq: moment(to, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
                     
                        $or: [{'filter.branchesIds': {$eq: branchesIds }},{'filter.groupOfBranchesIds': { $eq: servicesIds }},{'filter.servicesIds': {$eq: groupOfBranchesIds }}]})
                    .toArray()
                    .then(result => {

                           
                            if (result.length) {

                                resolve(result)

                            } else {
                         
                                resolve(result)

                            }
                        }).catch(error => {
                            console.log(error);
                        })

以下代码使用$all,这会使查询不返回任何文档:
            let _branchIds = branchesIds || [];
            let _servicesIds = servicesIds || [];
            let _groupOfBranchesIds = groupOfBranchesIds || [];

 db.collection("requests")
                    .find({'filter.dateRange.from': {$eq: moment(from, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
                        'filter.dateRange.to': {$eq: moment(to, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
                    
                        $or: [{'filter.branchesIds': {$all: _branchIds }},{'filter.groupOfBranchesIds': { $all: _servicesIds }},{'filter.servicesIds': {$all: _groupOfBranchesIds }}]})
                    .toArray()
                    .then(result => {

                          
                            if (result.length) {

         
                                resolve(result)

                            } else {
                                
                    
                                resolve(result)

                            }
                        }).catch(error => {
                            console.log(error);
                        })
2个回答

1

首先,您必须确保您的参数是数组,因此您必须按照以下方式进行转换:

    if (!branchesIds ) {
    branchesIds = [branchesIds];
}

if (!servicesIds ) {
    servicesIds = [servicesIds];
}

if (!groupOfBranchesIds ) {
    groupOfBranchesIds = [groupOfBranchesIds];
}

那么您的查询应该使用 $in

find({'filter.dateRange.from': {$eq: moment(from, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
    'filter.dateRange.to': {$eq: moment(to, "YYYY-MM-DD").startOf('day').format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},
    $or: [{'filter.branchesIds': { $in: branchesIds }},{'filter.groupOfBranchesIds': { $in: groupOfBranchesIds }},{'filter.servicesIds': { $in: servicesIds }}]})
.sort({_created_at: -1})
.toArray()

现在应该可以正常工作了。希望这能帮到你!


1
谢谢,我尝试了一下,现在它可以工作了! - ojsl

0

你应该使用$in而不是$eq,当你需要对数组进行操作时,请使用$in

$or: [{'filter.branchesIds': {$in: branchesIds }},{'filter.groupOfBranchesIds': { $in: servicesIds }},{'filter.servicesIds': {$in: groupOfBranchesIds }}]})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接