簡體   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