【问题标题】:MongoDB Aggregate: Filtering in projectMongoDB Aggregate:在项目中过滤
【发布时间】:2021-09-11 21:45:54
【问题描述】:

我有 4 个收藏。

Chat,
ChatUser,
Messages,
User

三个集合的文件是,

Chat: 
_id,
type ('dual', 'group')

ChatUser:
_id,
userId (Ref: Users)
chatId (Ref: Chat)

Messages:
_id,
chatId (Ref: Chat)
type: ('text', 'media')
message

Users:
_id,
name,
avatar

我将在 ChatUser 表中使用相同的 ChatId 存储我的用户 ID 和我的合作伙伴的用户 ID。

当我尝试列出我的所有聊天记录时,我会从 ChatUser 表中收集我的所有聊天记录并将它们应用到以下聊天聚合中。

let chats = await Chat.aggregate([
    { $match: { _id: { $in: chatsOfUser } } },
    {
      $lookup: {
        from: "chatusers",
        // let: { 'chatId': "$_id" },
        // pipeline: [
        //   {
        //     $match: { $expr: { $cond: [{ $$userId: { $ne: req.user._id } }] } },
        //   },
        // ],
        localField: "_id",
        foreignField: "chatId",
        as: "ChatUser",
      },
    },
    {
      $lookup: {
        from: "messages",
        localField: "_id",
        foreignField: "chatId",
        as: "messages",
      },
    },
    {
      $project: {
          _id:1,
          type:1,
          messages:1,
        ChatUser: {
          $filter: {
            input: "$ChatUser",
            as: "chatuser",
            cond: {$ne:["$$chatuser.userId",req.user._id]} // Trying to Ignore requested User Details from here
          },
        },
      },
    },
  ]);

但是,我仍然使用以下请求的用户 ID 获取数据。

[
  {
    "_id": "60daed3ce2c7136e4e88314d",
    "type": "dual",
    "messages": [
      {
        "_id": "60db215629d01c669696cb9b",
        "message": "Hello friend",
        "type": "text",
        "chatId": "60daed3ce2c7136e4e88314d",
        "fromUserId": "60daeb5617b93e6cb968582e"
      },
      {
        "_id": "60db215629d01c669696cb9c",
        "message": "Hi buddy",
        "type": "text",
        "chatId": "60daed3ce2c7136e4e88314d",
        "fromUserId": "60d9ca3a4f70d8496fd47d4a"
      },
      {
        "_id": "60db215629d01c669696cb9d",
        "message": "Long time no speak",
        "type": "text",
        "chatId": "60daed3ce2c7136e4e88314d",
        "fromUserId": "60d9ca3a4f70d8496fd47d4a"
      }
    ],
    "ChatUser": [
      {
        "_id": "60daed3ce2c7136e4e88314f",
        "chatId": "60daed3ce2c7136e4e88314d",
        "userId": "60daeb5617b93e6cb968582e",       // This is requested User Id. I need to ignore it from projecting.
        "createdAt": "2021-06-29T09:51:56.937Z",
        "updatedAt": "2021-06-29T09:51:56.937Z",
        "__v": 0
      },
      {
        "_id": "60daed3ce2c7136e4e883151",
        "chatId": "60daed3ce2c7136e4e88314d",
        "userId": "60d9ca3a4f70d8496fd47d4a",
        "createdAt": "2021-06-29T09:51:56.940Z",
        "updatedAt": "2021-06-29T09:51:56.940Z",
        "__v": 0
      }
    ]
  },
  {
    "_id": "60db388deb35c276cd023f32",
    "type": "dual",
    "messages": [
      {
        "_id": "60db38f729d01c669696cb9e",
        "message": "Hello friend",
        "type": "text",
        "chatId": "60db388deb35c276cd023f32",
        "fromUserId": "60daeb5617b93e6cb968582e"
      },
      {
        "_id": "60db38f729d01c669696cb9f",
        "message": "Hi buddy",
        "type": "text",
        "chatId": "60db388deb35c276cd023f32",
        "fromUserId": "60db387feb35c276cd023f1f"
      },
      {
        "_id": "60db38f729d01c669696cba0",
        "message": "Long time no speak",
        "type": "text",
        "chatId": "60db388deb35c276cd023f32",
        "fromUserId": "60db387feb35c276cd023f1f"
      }
    ],
    "ChatUser": [
      {
        "_id": "60db388deb35c276cd023f34",
        "chatId": "60db388deb35c276cd023f32",
        "userId": "60daeb5617b93e6cb968582e",  // This is requested User Id. I need to ignore it from projecting.
        "createdAt": "2021-06-29T15:13:17.245Z",
        "updatedAt": "2021-06-29T15:13:17.245Z",
        "__v": 0
      },
      {
        "_id": "60db388deb35c276cd023f36",
        "chatId": "60db388deb35c276cd023f32",
        "userId": "60db387feb35c276cd023f1f",
        "createdAt": "2021-06-29T15:13:17.253Z",
        "updatedAt": "2021-06-29T15:13:17.253Z",
        "__v": 0
      }
    ]
  }
]

【问题讨论】:

    标签: mongodb mongoose filter project aggregation


    【解决方案1】:

    您可以使用查找的pipeline 选项(已注释掉),在其中添加 $project 阶段,并指示不要投影userId

    let chats = await Chat.aggregate([
        { $match: { _id: { $in: chatsOfUser } } },
        {
          $lookup: {
            from: "chatusers",
            let: { 'cId': "$_id" },
            pipeline: [  // <-- Added Pipeline
              {
                $match: { 
                  $expr: { 
                    "$eq": ["$chatId", "$$cId"] 
                  } 
                },
              },
              {
                "$project": {  // <-- Adding projection stage and not projecting `userId`
                  "userId": 0,
                },
              },
            ],
            localField: "_id",
            foreignField: "chatId",
            as: "ChatUser",
          },
        },
        {
          $lookup: {
            from: "messages",
            localField: "_id",
            foreignField: "chatId",
            as: "messages",
          },
        },
        {
          $project: {
              _id:1,
              type:1,
              messages:1,
            ChatUser: {
              $filter: {
                input: "$ChatUser",
                as: "chatuser",
                cond: {$ne:["$$chatuser.userId",req.user._id]} // Trying to Ignore requested User Details from here
              },
            },
          },
        },
      ]);
    

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2021-11-24
      • 1970-01-01
      • 2017-07-08
      • 2018-08-16
      • 2013-02-20
      • 1970-01-01
      • 2019-05-24
      • 2015-07-14
      相关资源
      最近更新 更多