从对象数组内部的数组中获取特定对象 express js mongodb

问题描述 投票:0回答:1

我在用户数组中有

friends
数组,我需要通过电子邮件获取特定用户的所有
friends
approved
字段是
true

在 nodejs 中我有用户 mongo 模式

const UserSchema = mongoose.Schema({
     username : {type: String , required :true},
     email : {type: String , required :true, unique: true, match: /.+\@.+\..+/},
     password : {type: String , required :true},
     friends : {type:[{username : String, approved: Boolean}]},
});

[
  {
    "username": "ali",
    "email": "ali200@gmail,com",
    "password": "pdcjjfefmkadjakefkeofjafjafsfjsalnnryifajs",
    "friends": [
      {
        "id": "1",
        "username": "gamal",
        "approved": true
      },
      {
        "id": "2",
        "username": "osama",
        "approved": false
      },
      {
        "id": "3",
        "username": "john",
        "approved": true
      }
    ]
  }
]

我需要得到

friends
对象的数组,
approved
字段是
true
像这样

[
     {
        "id": "1",
        "username": "gamal",
        "approved": true
      },
      {
        "id": "3",
        "username": "john",
        "approved": true
      }

]

代码来自评论:

router.get("/getFriends", (req, res) => {
      var email = getEmailFromToken(req.header("Authorization"));
      User.findOne({
        email: email
      }).then((user) => res.status(200).send({
        friends: user.friends
      }));
javascript node.js mongodb express mongoose
1个回答
0
投票

通过代码,可以用

完成
User.findOne({ email: email }).then((user) => {
  const friends = user.friends.filter((f) => f.approved);
  res.status(200).send({ friends });
});

或者您可以改用查询

User.agregate([
  {
    $match: {
      email: "[email protected]",
    },
  },
  {
    $project: {
      _id: 1,
      friends: {
        $filter: {
          input: "$friends",
          as: "truelyFriend",
          cond: {
            $eq: ["$$truelyFriend.approved", true],
          },
        },
      },
    },
  },
]).then((user) => {
  res.status(200).send({ friends: user[0].friends });
});

mongo 测试器:mongo-playground

© www.soinside.com 2019 - 2024. All rights reserved.