Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在mongoose中使用addtoset命令添加多个相同的文档_Mongodb_Mongoose - Fatal编程技术网

Mongodb 在mongoose中使用addtoset命令添加多个相同的文档

Mongodb 在mongoose中使用addtoset命令添加多个相同的文档,mongodb,mongoose,Mongodb,Mongoose,我的模式是 var UserQuizSchema = mongoose.Schema({ uid:{type:ObjectId,required: true,index:true}, answer:[{content:String, qid:ObjectId ,time:Date }], }); 在此模式中,“uid”表示用户标识符,“answer”数组存储学生回答的答案。在每个答案中,qid与问题ID相关,“内容”是学生的真实答案,“时间

我的模式是

var UserQuizSchema = mongoose.Schema({   
        uid:{type:ObjectId,required: true,index:true},
        answer:[{content:String, qid:ObjectId ,time:Date }],        
});
在此模式中,“uid”表示用户标识符,“answer”数组存储学生回答的答案。在每个答案中,qid与问题ID相关,“内容”是学生的真实答案,“时间”是答案的修改时间戳

在这里,我使用mongoose将新答案插入到数组中

function updateAnswer(uid,question_id,answer,callback){

    var options = { new: false };   
    var quiz_id = mongoose.Types.ObjectId(quiz_id);
    var qid = mongoose.Types.ObjectId(question_id);
    UserQuizModel.findOneAndUpdate({'uid':uid},{'$addToSet':{'answer':{'qid':qid, 'content':answer} } },options,function(err,ref){
        if(err) {
            console.log('update '.red,err);
            callback(err, null);
        }else{
            console.log('update '.green+ref);                 
            callback(null,ref);
        }
    })
} 
一般来说,通过使用addToSet命令,应答数组中的元素应该是唯一的,但在我的示例中,应答数组只能有多个相同的嵌入文档,除了每个嵌入文档都有一个唯一的OjbectId\u id

比如

 answer:
  [ { qid: 5175aecf0e5b061414000001, _id: 518a5e5895fc9ddc1e000003 },
    { qid: 5175aecf0e5b061414000001, _id: 518a5e5f95fc9ddc1e000004 } ] }
您可以看到两个嵌入文档的qid是相同的,但是_id是不同的


为什么会有一个额外的_id,我不把它放在模式设计中???

您可以通过显式地为
\u id
选项设置为false的元素定义模式来禁用嵌入对象中的
\u id

var UserQuizSchema=mongoose.Schema({
uid:{type:ObjectId,必需:true,索引:true},
回答:[新模式({content:String,qid:ObjectId,time:Date},{u id:false})]
});

谢谢你,约翰尼,确实“身份证”不见了。但另一个问题是,使用“$addToSet”命令多次添加同一个嵌入文档会导致系统中出现多个相同的嵌入文档array@user824624你能用一个简单的例子来更新你的问题吗?