【问题标题】:Search query String Array Object in mongoose and use elemMatch is not working as expected在猫鼬中搜索查询字符串数组对象并使用 elemMatch 未按预期工作
【发布时间】: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


【解决方案1】:

我假设你想匹配每个来自skillsOffer 数组的名称。这样,您必须为每个名称定义一个 $elemMatch 对象(基本上映射每个名称)。

您可以在代码中使用以下(部分)查询来检查是否全部名称包含在您的 searchFilterSkills.searchSkillsOffer 数组中。

{
  'searchFilterSkills.searchSkillsOffer': {
    $all: job.skillsOffer
      .map((user) => user.name)
      .map((name) => ({
        $elemMatch: {
          name: {
            $regex: new RegExp(`^${name}$`, 'i'),
          },
        },
      })),
  },
}

【讨论】:

  • 它不应该是所有匹配,如果其中一个匹配就足够了。我应该使用什么查询?
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2018-10-14
  • 2019-03-28
  • 2021-01-12
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多