在Mongoose中用ObjectId嵌套数组

我试图logging用户已经投票的post的ID,我正在为它创build一个模式,像这样:

var userSchema = new Schema({ twittername: String, twitterID: Number, votedPosts: [{ObjectId : {votetype : Number}} ] }); 

用户得到完美创build,我想更新投票的属性,每当用户投票的东西,所以我打电话:

 User.update({twitterID : req.body.userID} , { $push : {votedPosts : {postID : {votetype: newvotetype }}}} ,function (err, user, raw) { if (err){ console.log(err); } else{ console.log('user ' + user); } }); 

不幸的是,结果并不像我在模式中描述的那样,我得到这个结果:

  db.users.find().pretty() { "__v" : 0, "_id" : ObjectId("51bf4ef8dbda2f2e0c000001"), "twitterID" : 102016704, "twittername" : "gorkemyurt", "votedPosts" : [ { "_id" : ObjectId("51bf5e48c3ffefe20c000002") } ] } 

我混淆了额外的“_id”mongoose在投票数组中添加..为什么无法ObjectId(“51bf5e48c3ffefe20c000002”)是关键值对的关键?

我认为你的问题源于你的模式。 您应该尝试定义密钥不能dynamic更改的模式。 MongoDB不支持关于文档键的查询,只是值。

我认为在上面的模式中使用dynamic的“ObjectID”作为关键是导致Mongoose的怪异,并导致你的问题。 但是,即使你的查询被正确地传播到MongoDB,它仍然不会产生你想要的输出。 原因是MongoDB会将“postID”解释为一个String,而不pipe你是否定义了一个postIDvariables来保存一个dynamic值。 如果使用variablespostID从mongo shell运行查询,则这是输出:

 > var postID = 1234 > db.users.update( {twitterID : 102016704}, {$push : {votedPosts : {postID : {votetype: "newvotetype" }}}} ) { "__v" : 0, "_id" : ObjectId("51bf4ef8dbda2f2e0c000001"), "twitterID" : 102016704, "twittername" : "gorkemyurt", "votedPosts" : [ { "postID" : { "votetype" : "newvotetype" } } ] } 

我build议你使用另一个模式。 我在下面提出的模式涉及将第二个模式embedded到现有模式中 。 尝试这样的事情:

 var votedPost = new Schema({ postID: ObjectId, votetype : Number }); var userSchema = new Schema({ twittername: String, twitterID: Number, votedPosts: [votedPost] }); 

这样,你也可以在postID字段上查询,MongoDB处理得非常好。 那有意义吗? 🙂