代码之家  ›  专栏  ›  技术社区  ›  Dagger

有没有办法在查找方法中使用OR?

  •  1
  • Dagger  · 技术社区  · 2 年前

    我正在使用Express/MongoDB克隆Facebook,并添加好友。我有它,所以当一个用户点击另一个用户页面上的按钮时,上面写着“ 发送好友请求 “它向他们发送朋友请求,并存储在 FriendRequest 架构。

    const friendRequestSchema = new mongoose.Schema({
      sender: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true,
      },
      receiver: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true,
      },
      status: {
        type: String,
        enum: ["pending", "accepted", "rejected"],
        default: "pending",
      },
      createdAt: {
        type: Date,
        default: Date.now,
      },
    });
    

    用户会收到通知,他们可以接受或拒绝请求。如果他们接受好友请求,状态将从 pending accepted

    这就是我的代码的来源。

    我有一个 friends ejs页面,我正在尝试绘制所有 已接受 用户分配的好友 好友请求 架构。我计划使用此页面显示所有用户朋友的列表。示例: /:user/friends

    router.get("/:user/friends", async function (req, res) {
      const user = req.user.username;
    
      const friends = await FriendRequest.find({
        sender: req.user.id, // my issue
        status: "accepted",
      })
        .populate("sender")
        .populate("receiver")
        .exec();
      res.render("friends", { user, friends });
    });
    

    这是我的密码。问题出在它说的地方 sender: req.user.id 。当我有这样的功能时,它只显示我个人向其发送好友请求的好友列表,而不显示任何向我发送过好友请求的朋友。反之亦然。如果我改变 sender receiver 它只会显示向我发送好友请求的好友。

    下面是一个被接受的朋友的例子,当我使用 console.log 。每一个都被分配 发件人 接受者

    _id: new ObjectId("6471d4a3a705acadf8af8923"),
       sender: {
         friends: [],
         _id: new ObjectId("6454407483df47caef5004e2"),
         username: 'Dagger',
         createdAt: 2023-05-04T23:32:04.128Z,
         __v: 0
    },
    

    当我把两者都放进去 发件人:req.user.id receiver: req.user.id 在代码内部,什么都没有显示。我一直在想办法做到这一点,如果 发件人 OR 接受者 等于 req.user.id 它会显示朋友的用户名,但我很难找到方法,因为我不能使用 || 内部 find 方法

    我希望我的代码看起来像这样

    const friends = await FriendRequest.find({
        sender || receiver: req.user.id,
        status: "accepted",
    })
    

    但在某种程度上不会给我带来错误。

    1 回复  |  直到 2 年前
        1
  •  4
  •   Srushti Shah    2 年前

    你的语法是错误的。你需要使用 $or 操作人员

    refer operators and projection

    const friends = await FriendRequest.find({
        $or: [
             {sender: req.user.id},
             {receiver: req.user.id}
        ],
        status: "accepted"
    })
    

    或者

    const friends = await FriendRequest.find({
        $and: [
             {$or: [
                  {sender: req.user.id},
                  {receiver: req.user.id}
              ]},
              {status: "accepted"}
        ]
    })