【发布时间】:2022-10-17 03:48:10
【问题描述】:
我面临一个我无法解决的错误。 我想使用查询搜索来搜索 1 个工作的数据是否与用户数据匹配,但在某些情况下我被卡住了。 第一种情况是我对工作的查询搜索看起来像这样我的意思是数据。
问题是在 searchFilterSkills.searchSkillsOffer 我有一个对象数组,如果其中一个存在,我想匹配每个对象的名称,但我无法遍历它们,因为我得到了一个带有 .map 的字符串数组() 不能对其进行迭代。
在 Fabian 的回答之后,如果所有元素都匹配,它会返回元素并且它匹配但我想要如果 1 个元素匹配它会返回对象。 我试过 $in 但没有用。是否有任何查询可以使用而不是$全部
这些是我尝试搜索的数据。
"skillsOffer":[
{
"name":"Max",
"rate":0
},
{
"name":"Test",
"rate":0
},
{
"name":"Javascript",
"rate":0
}
],
"country":"DEU",
"postalCode":12345
这些是他/她拥有的用户数据。
"searchFilter" : {
"remote" : 0,
"data" : [
{
"region" : [
"1"
],
"country" : "DEU",
"searchActive" : false,
"postalCode" : "123",
"available" : {
"$date" : 1664955924380
}
}
]
},
"searchFilterSkills" : {
"searchSkillsOffer" : [
{
"name" : "Javascript",
"rate" : 100
},
{
"name" : "Test",
"rate" : 60
},
{
"name" : "Client",
"rate" : 0
}
],
}
在skillsOffer,我想搜索是否只有名称匹配而不匹配速率。
然后,如果远程为 1,则搜索上述查询且不带远程或上述远程的邮政编码。
async searchUsers(req, res, next) {
const jobID = req.query.jobID;
let job = await Job.findById(jobID);
let postalCode = job.postalCode;
postalCode = postalCode.toString().slice(0, 1);
let postalCode2 = job.postalCode;
postalCode2 = postalCode2.toString().slice(0, 2);
let postalCode3 = job.postalCode;
postalCode3 = postalCode3.toString().slice(0, 3);
let postalCode4 = job.postalCode;
postalCode4 = postalCode4.toString().slice(0, 4);
let postalCode5 = job.postalCode;
postalCode5 = postalCode5.toString().slice(0, 0);
let userIds = job.skillsOffer.map(user => user.name).join(",");
let users = await User.find({
"searchFilter.data": {
$elemMatch: {
"$or": [
{
postalCode: postalCode,
},
{
postalCode: postalCode2,
},
{
postalCode: postalCode3,
},
{
postalCode: postalCode4,
},
{
postalCode: postalCode,
},
{
postalCode: postalCode5,
},
]
}
},
"searchFilter.data": {
$elemMatch: {
country: job.country
}
},
"searchFilterSkills.searchSkillsOffer": {
$elemMatch: {
name: {$regex: new RegExp(`^${userIds}$`, 'i')} here should come each Name of array of objects
}
},
});
if (job.remote.toString() === "1") {
users = await User.find({
"searchFilter.data": {
$elemMatch: {
"$or": [
{
postalCode: postalCode,
},
{
postalCode: postalCode2,
},
{
postalCode: postalCode3,
},
{
postalCode: postalCode4,
},
{
postalCode: postalCode,
},
{
postalCode: postalCode5,
},
]
}
},
"searchFilter.data": {
$elemMatch: {
country: job.country
}
},
"searchFilter.remote": job.remote,
});
}
/*if (req.query.remote.toString() === "1") {
users = await User.find({
"searchFilter.data": {
$elemMatch: {
country: req.query.country
}
},
"searchFilterSkills.searchSkillsOffer": {
$elemMatch: {
name: {$regex: new RegExp(`^${req.query.skillsName}$`, 'i')}
}
},
"searchFilter.remote": req.query.remote,
});
} */
if (!users) {
res.status(204).json({ error: "No Data" });
return;
}
return res.status(200).send({
user: users.map(t =>
t._id
)
});
},
【问题讨论】:
-
你能缩小你遇到的实际问题吗?您的代码非常复杂,因此尚不清楚您具体面临哪个问题。你能指出你的代码的哪一部分没有按预期工作吗?
-
@FabianStrathaus 我已经更新了我的问题。它在 searchSkillsOffer 数组上的问题。
标签: javascript mongodb express mongoose