我想只返回状态为“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}}]
})
我只想回复状态为“有效”的朋友。有帮助吗? 谢谢!
答案 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)
})