Javascript Mongoose中带有ObjectId的嵌套数组

Javascript Mongoose中带有ObjectId的嵌套数组,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图记录用户投票的帖子的id,我正在为它创建一个模式,如下所示: var userSchema = new Schema({ twittername: String, twitterID: Number, votedPosts: [{ObjectId : {votetype : Number}} ] }); 用户创建得非常完美,我希望在用户投票时更新votedPosts属性,因此我调用: User.update({twitterID : req.body.user

我试图记录用户投票的帖子的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弄糊涂了。。为什么objectid51bf5e48c3ffefe20c00002不能是键值对的键

我认为你的问题源于你的模式。您应该尝试定义一个模式,其中键不会动态更改。MongoDB不支持对文档键的查询,只支持对值的查询

我认为在上面的模式中使用动态ObjectID作为键会导致Mongoose的怪异,并导致您的问题。但是,即使您的查询被正确地传播到MongoDB,它仍然不会产生您想要的输出。原因是MongoDB将postID解释为字符串,而不管您是否定义了某个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"
            }
        }
    ]
}
我建议您使用另一种模式。我在下面提出的模式包括。试着这样做:

var votedPost = new Schema({
    postID: ObjectId,
    votetype : Number 
  });

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

这样,您还可以查询postID字段,MongoDB可以很好地处理该字段。这有意义吗

我认为你的问题源于你的模式。您应该尝试定义一个模式,其中键不会动态更改。MongoDB不支持对文档键的查询,只支持对值的查询

我认为在上面的模式中使用动态ObjectID作为键会导致Mongoose的怪异,并导致您的问题。但是,即使您的查询被正确地传播到MongoDB,它仍然不会产生您想要的输出。原因是MongoDB将postID解释为字符串,而不管您是否定义了某个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"
            }
        }
    ]
}
我建议您使用另一种模式。我在下面提出的模式包括。试着这样做:

var votedPost = new Schema({
    postID: ObjectId,
    votetype : Number 
  });

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    votedPosts: [votedPost]
  });
这样,您还可以查询postID字段,MongoDB可以很好地处理该字段。这有意义吗