Mongoose Model.find()参数问题

时间:2017-10-09 16:31:25

标签: node.js mongodb mongoose mongoose-schema

我正在研究一个节点应用程序(带有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)

3 个答案:

答案 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
Voot.find({“user”: userId}).populate(‘user’) .exec()

感谢所有答案!