使用Mongoose Node.js过滤MongoDB数据库 [英] Flter mongodb database using mongoose nodejs

查看:70
本文介绍了使用Mongoose Node.js过滤MongoDB数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要根据一些固定标准过滤一些用户.我有一个 user 集合和一个 talent 集合.人才收藏包含对主类别收藏的引用.

I need to filter some users according to some fixed criteria. I have a user collection and a talent collection. The talent collection holds the reference to a master category collection.

我需要根据人才集合中的类别和用户集合中的某些键来过滤这些用户.

What I need is to filter these users according to the category in the talent collection and some keys from the user collection.

例如,我需要搜索一个性别为男性",教育程度为"BTech"并且具有程序员和测试员才能的用户

我的用户集合就像

{
    "_id": "5f1939239bd35429ac9cd78f",
    "isOtpVerified": "false",
    "role": "user",
    "adminApproved": 1,
    "status": 0,
    "languages": "Malayalam, Tamil, Telugu, Kannada",
    "name": "Test user",
    "email": "test@email.com",
    "phone": "1234567890",
    "otp": "480623",
    "uid": 100015,
    "bio": "Short description from user",
    "dob": "1951-09-07T00:00:00.000Z",
    "gender": "Male",
    "education": "Btech",
    "bodyType": "",
    "complexion": "",
    "height": "",
    "weight": "",
    "requests": [],
    "location": {
        "place": "place",
        "state": "state",
        "country": "country"
    },
    "image": {
        "avatar": "5f1939239bd35429ac9cd78f_avatar.jpeg",
        "fullsize": "5f1939239bd35429ac9cd78f_fullsize.png",
        "head_shot": "5f1939239bd35429ac9cd78f_head_shot.jpeg",
        "left_profile": "5f1939239bd35429ac9cd78f_left_profile.png",
        "right_profile": "5f1939239bd35429ac9cd78f_right_profile.png"
    },
    "__v": 42,
    "createdAt": "2020-07-23T07:15:47.387Z",
    "updatedAt": "2020-08-18T18:54:22.272Z",
}

人才收集

[
    {
        "_id": "5f38efef179aca47a0089667",
        "userId": "5f1939239bd35429ac9cd78f",
        "level": "5",
        "chars": {
            "type": "Fresher",
        },
        "category": "5f19357b50bcf9158c6be572",
        "media": [],
        "createdAt": "2020-08-16T08:35:59.692Z",
        "updatedAt": "2020-08-16T08:35:59.692Z",
        "__v": 0
    },
    {
        "_id": "5f3b7e6f7e322948ace30a2c",
        "userId": "5f1939239bd35429ac9cd78f",
        "level": "3",
        "chars": {
            "type": "Fresher",
        },
        "category": "5f19359250bcf9158c6be573",
        "media": [
            {
                "adminApproved": 0,
                "status": 0,
                "_id": "5f3c22573065f84a48e04a14",
                "file": "id=5f1939239bd35429ac9cd78f&dir=test&img=5f1939239bd35429ac9cd78f_image_undefined.jpeg",
                "description": "test",
                "fileType": "image",
                "caption": "test file"
            },
            {
                "adminApproved": 0,
                "status": 0,
                "_id": "5f3c2d7a8c7f8336b0bfced2",
                "file": "id=5f1939239bd35429ac9cd78f&dir=test&img=5f1939239bd35429ac9cd78f_image_1.jpeg",
                "description": "this is a demo poster for testing",
                "fileType": "image",
                "caption": "A Test Poster"
            }
        ],
        "createdAt": "2020-08-18T07:08:31.532Z",
        "updatedAt": "2020-08-18T19:35:22.899Z",
        "__v": 2
    }
]

以上文档中的类别是一个单独的类别.类别集合为

And the category in the above document is a separate one populated to this. the category collection as,

[
        {
            "_id": "5f19359250bcf9158c6be573",
            "status": true,
            "title": "Testing",
            "description": "Application tester",
            "code": "test",
            "characteristics": [],
            "createdAt": "2020-07-23T07:00:34.221Z",
            "updatedAt": "2020-07-23T07:00:34.221Z",
            "__v": 0
        },
        {
            "status": true,
            "_id": "5f29829a705b4e648c28bc88",
            "title": "Designer",
            "description": "UI UX Designer",
            "code": "uiux",
            "createdAt": "2020-08-04T15:45:30.125Z",
            "updatedAt": "2020-08-04T15:45:30.125Z",
            "__v": 0
        },
        {
            "_id": "5f19357b50bcf9158c6be572",
            "status": true,
            "title": "programming",
            "description": "Java programmer",
            "code": "program",
            "createdAt": "2020-07-23T07:00:11.137Z",
            "updatedAt": "2020-07-23T07:00:11.137Z",
            "__v": 0
        }
    ]

所以我的过滤条件将是

{
    categories: ["5f19359250bcf9158c6be573", "5f19357b50bcf9158c6be572"],
    minAge: 18,
    maxAge: 25,
    minHeight: 5,
    maxHeight: 6,
    minWeight: 50,
    maxWeight: 80,
    complexion: "white",
    gender: "male",
}

预期结果将是用户具有上述才能和条件,

And the expected result will be a user have both the above talents and followed conditions,

{
    users: { ..User details.. },
    medias: { ...medias from the matching talents.. }
}

推荐答案

您需要使用使用管道进行$ lookup

  • $ match 进行类别匹配
  • 的条件
  • $ lookup 加入 users 集合
      用户收集字段的
    • $ match 条件
    • $match you condition for category match
    • $lookup to join users collection
      • $match conditions for users collections fields
      db.talents.aggregate([
        {
          $match: {
            category: { $in: ["5f19359250bcf9158c6be573", "5f19357b50bcf9158c6be572"] }
          }
        },
        {
          $lookup: {
            from: "users",
            as: "users",
            let: { userId: "$userId" },
            pipeline: [
              {
                $match: {
                  $expr: {
                    $and: [
                      { $eq: ["$$userId", "$_id"] },
                      { $eq: ["$gender", "Male"] },
                      { $eq: ["$education", "Btech"] }
                      // ... add you other match criteria here 
                    ]
                  }
                }
              }
            ]
          }
        },
        { $match: { users: { $ne: [] } } }
      ])
      

      游乐场

      这篇关于使用Mongoose Node.js过滤MongoDB数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆