我正在研究一个节点应用程序(带有IOS前端),并偶然发现了这个问题。我和mongoose一起使用了mongodb。我有这条路线,/ get接收到正确的用户ID,并试图找到具有相同用户ID的所有'Voots'。这就是'Voot'的样子:
{
"_id": "59db9fa2659bb30004899f05",
"title": "Pizza!",
"body": "hoppakeeee",
"user": {
"__v": 0,
"password": "$2a$10$Rwb5n7QoKaFaAOW37V0aWeEeYgfn6Uql474ynUXb83lHi7H2CuB1u",
"email": "noelle.schrikker@planet.nl",
"name": "Noelle Schrikker",
"_id": "59db9ecf659bb30004899f04"
},
"__v": 0,
"downVotes": [],
"upVotes": []
},
如您所见,它有一个名为user
的属性,它是一个包含姓名,电子邮件,密码和_id
的用户对象。
我按照我的要求这样做:
// Send all voots from the specific user
Voot.find({"user._id": userId}, function(err, voots) {
if (err) {
console.log(err);
res.status(400).send(err)
res.end()
}
if (voots) {
res.status(200).send(voots)
res.end()
}
})
我尝试查找所有voot,其user
具有userId
的属性(这是正确的用户ID)。但是,这不起作用。我尝试通过"user.email"
找到它确实有效。我认为这与_
之前的id
有关。任何评论都表示赞赏!
Voot shema:
var vootSchema = new mongoose.Schema({
title: String,
body: String,
user: {
type: mongoose.Schema.Types,
ref: 'user'
},
upVotes: [String],
downVotes: [String]
})
var Voot = mongoose.model('voot', vootSchema)
Userschema:
var userSchema = new mongoose.Schema({
name: String,
email: String,
password: String
})
var User = mongoose.model('user', userSchema)
答案 0 :(得分:1)
我认为_id
对象的user
不是字符串。这就是说你需要修改你的查询以使用ObjectId
而不是字符串:
Voot.find({"user._id": ObjectId(userId)}, function(err, voots) {
if (err) {
console.log(err);
res.status(400).send(err)
res.end()
}
if (voots) {
res.status(200).send(voots)
res.end()
}
})
如果您不想更改查询,可以更改user
架构,以便_id
为字符串。然后您的查询应该开始工作:
var userSchema = new mongoose.Schema({
_id: { type: String },
name: String,
email: String,
password: String
})
var User = mongoose.model('user', userSchema)
答案 1 :(得分:0)
在查询中仅使用用户而不是 user._id :
Voot.find({ "user": userId }, function(err, voots) {
// Callback code
})
ID或引用的用户存储在用户字段中。用户子文档以及 user._id 字段仅在填充后才可用。
答案 2 :(得分:0)
知道了!我在Voot模式中添加了.ObjectId
,现在我可以使用population访问User对象。我现在可以使用:
Voot.find({“user”: userId}).populate(‘user’) .exec()
感谢所有答案!