繁体   English   中英

带有ObjectId的Mongoose中的嵌套数组

[英]Nested Arrays in Mongoose with ObjectId

我正在尝试记录用户已投票的帖子的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")
            }
        ]
    }

猫鼬在投票的数组中添加了额外的“ _id”,这让我感到困惑。为什么ObjectId(“ 51bf5e48c3ffefe20c000002”)不能成为键值对的键?

我认为您的问题源于您的架构。 您应该尝试定义一个架构,在其中密钥不会动态更改。 MongoDB不支持对文档键的查询,仅支持值。

我认为在上面的模式中使用动态的“ ObjectID”作为键会导致猫鼬怪异,并引起您的问题。 但是,即使您的查询已正确传播到MongoDB,它仍然不会产生您想要的输出。 这样做的原因是,无论您是否已定义一些postID变量来保存动态值,MongoDB都会将“ 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]
  });

这样,您还可以查询MongoDB很好处理的postID字段。 那有意义吗? :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM