繁体   English   中英

使用 mongoose nodejs 过滤 mongodb 数据库

[英]Flter mongodb database using mongoose nodejs

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

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

For example I need to search for a user whose gender is 'male' and education 'BTech' and will have talents as a programmer and tester

我的用户收藏就像,

{
    "_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
    }
]

上面文档中的类别是一个单独的类别。 类别集合为,

[
        {
            "_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",
}

并且预期的结果将是一个用户同时具备上述才能和遵循的条件,

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

如果有两个collections您需要通过primary key或带有外部字段的_id将它们join起来,您可以使用$lookup$match进行过滤。 文档

您需要将$lookup 与 pipeline一起使用,

  • $match你的category匹配条件
  • $lookup加入users集合
    • 用户的$match条件 collections 字段
  • $match排除在条件中未找到符合条件的匹配users的文档
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: [] } } }
])

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM