如何使用$查询嵌套的mongoDB或在NodeJ中的数组的嵌套字段中进行查询



我正在尝试查询mongoDB集合,以获取并匹配特定的日期范围和特定的id数组,如brachId或servicesId。

如果查询找到这个结果,我希望它返回它,这样我就可以验证特定用户的请求是否已经存在于该集合中。

但是,每当我将数组值传递给查询的$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);
})

首先,您必须确保您的参数是数组,因此您必须按如下方式转换它们:

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()

现在应该可以了。希望这能有所帮助!

当您想对阵列执行操作时,您使用$eq而不是$in,使用$in

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

最新更新