gpt4 book ai didi

javascript - 带有 ObjectId 的 Mongoose 中的嵌套数组

转载 作者:行者123 更新时间:2023-11-30 07:41:01 26 4
gpt4 key购买 nike

我正在尝试记录用户投票的帖子的 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") 不能成为键值对的键?

最佳答案

我认为您的问题源于您的架构。您应该尝试定义一个模式,其中的键不会动态变化。 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"
}
}
]
}

我建议您使用其他架构。我在下面提出的架构涉及 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 可以很好地处理它。那有意义吗? :)

关于javascript - 带有 ObjectId 的 Mongoose 中的嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17155034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com