我正在尝试记录用户投票的帖子的ID,我正在为此创建一个架构:
var userSchema = new Schema({
twittername: String,
twitterID: Number,
votedPosts: [{ObjectId : {votetype : Number}} ]
});
用户被完美创建,我想在用户投票时更新votedPosts属性,所以我打电话:
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")
}
]
}
我很担心mongoose在votedPosts数组中添加的额外“_id”。为什么不能将ObjectId(“51bf5e48c3ffefe20c000002”)作为键值对的键?
答案 0 :(得分:7)
我认为您的问题源于您的架构。您应该尝试定义一个不会动态更改键的架构。 MongoDB不支持对文档键的查询,只支持值。
我认为使用动态“ObjectID”作为上面架构中的键会导致Mongoose的怪异,并导致您的问题。但是,即使您的查询正确传播到MongoDB,它仍然不会产生您想要的输出。原因是MongoDB会将“postID”解释为String,无论您是否定义了一些postID变量来保存动态值。如果您使用变量postID:
从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"
}
}
]
}
我建议您使用其他架构。我在下面提出的架构涉及embedding a second schema into your existing schema。尝试这样的事情:
var votedPost = new Schema({
postID: ObjectId,
votetype : Number
});
var userSchema = new Schema({
twittername: String,
twitterID: Number,
votedPosts: [votedPost]
});
这样,你也可以在postID字段上查询,MongoDB处理得非常好。那有意义吗? :)