猫鼬 - 填充不正确过滤

时间:2016-10-03 23:51:40

标签: node.js mongodb express mongoose mongoose-populate

我想只返回状态为“active”的数组中的friend对象。然而,当我收到请求时,我仍然看到状态为“待定”的朋友。

这是我的索引控制器:

index: function(req, res) {
    User.findOne({
      _id: req.params.id
    })
    .populate({path: "roommates", match: {status: {$eq: "active"}}})
    .exec(function(err, user) {
      console.log(user.roommates);
    })
  }

以下是登录控制台的结果:

[ { _id: 57f2e5e02d58f51a8284bc11,
    balance: 0,
    requests: [],
    status: 'pending' } ]

以下是我的用户模型供参考:

var UserSchema = new Schema({
  name: String,
  username: {
    type: String,
    required: [true, "Please enter a username"],
    minlength: [6, "Username must be at least 6 characters"],
    maxlength: [15, "Username cannot exceed 15 characters"],
    unique: true
  },
  password: {
    type: String,
    required: [true, "Please enter a password"],
    minlength: [6, "Password must be at least 6 characters"],
    maxlength: [17, "Password cannot exceed 17 characters"],
  },
  roommates: [{roommate: {type: Schema.Types.ObjectId, ref: "User", unique: true}, status: {type: String, default: "pending"}, requests: [{type: Schema.Types.ObjectId, ref: "Request"}], balance: {type: Number, default: 0}}]
})

我只想回复状态为“有效”的朋友。有帮助吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

由于引用位于用户模式的室友中,因此人口应为:

    .populate({path: "roommates.roommate"})

,结果如下:

[ { roommate: [Object], //populated object
    balance: 0,
    requests: [],
    status: 'pending' } ]

现在,即使你这样做:

.populate({path: "roommates.roommate", match: {status: {$eq: "active"}}})

它应该返回null:

[ { roommate: null,
balance: 0,
requests: [],
status: 'pending' } ]

因为您在室友中填充用户,并且用户架构没有状态或余额字段。状态和平衡是室友阵列中室友对象的附加字段。

当字段是引用对象的模式的一部分时,匹配工作。

一个选项是从室友中删除状态和余额字段,并使其成为用户架构的一部分。

然而,使用相同的设计,您可以使用过滤,因为室友的长度几乎不会超过10,这将是非常小的处理。

    User.findOne({
    _id: req.params.id
     })
    .exec(function(err, user) {
        user.roommates = user.roommates.filter(function (rm) {
            return rm.status == "active"
        });
        console.log(user.roommates)
    })