Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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
Javascript Mongodb/Mongoose:填充ObjectID数组(引用)_Javascript_Arrays_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongodb/Mongoose:填充ObjectID数组(引用)

Javascript Mongodb/Mongoose:填充ObjectID数组(引用),javascript,arrays,node.js,mongodb,mongoose,Javascript,Arrays,Node.js,Mongodb,Mongoose,我有一个运行MEAN环境的mongodb,它有两个collections用户和两本书。其中一个集合myusers包含对图书集合文档的ObjectID引用数组,例如: var UserSchema = new Schema({ [...], externalids: [{type: Schema.Types.ObjectId, ref: 'Books', required: false}] }, {collection: 'myusers'}); 在运行时,我希望不断用新

我有一个运行MEAN环境的mongodb,它有两个collections用户和两本书。其中一个集合myusers包含对图书集合文档的ObjectID引用数组,例如:

var UserSchema = new Schema({
    [...],
    externalids: [{type: Schema.Types.ObjectId, ref: 'Books', required: false}]
    }, {collection: 'myusers'});
在运行时,我希望不断用新书文档的ID填充数组externalID。我就是这样做的:

var newBook = new Book({ ... });

        newBook.save(function (err){
                if (err){
                    //whatever  
                }else{
                    User.update({ _id: req.user._id }, { $set: { externalids: newBook._id }}, function(err){
                        //whatever       
                    });
                }
        }); 
不幸的是,我不能使用以下内容:

externalids: externalids.push(newBook._id)
我甚至试过:

User.update({ _id: req.user._id }, { $push: { externalids: newBook._id }}
但这也没用。 因此,数组始终只包含一个最新的值,不会被填充。是否有一种快速方法可以附加更多值?如果有比先读取数组内容、将其存储到本地临时数组、追加新值并写回整个数组更快的方法,那就太好了。。。 干杯


Igor

尝试$addToSet而不是$push,以避免重复id

User.update({ _id: req.user._id }, { $addToSet : { externalids: newBook._id }}
可能的问题是,您以前使用$set更新用户。这将首先以字符串而不是数组的形式创建ExternalId,因此以后不能在ExternalId上使用$push/$addToSet。要更正此问题,请首先尝试将用户ExternalID更新为数组:

User.update({ _id: req.user._id }, { $set : { externalids: [] }}

即使使用$push,数组中仍然只有一个项目?不,使用$push不会改变任何东西!?甚至不改变单个项目…是newBook.\u id是ObjectId还是字符串表示形式?就是这样做的$push语句。确保您提供了一个回调来更新和检查错误。根据robomongo的说法,文档中存储的项目是Objectd5424…谢谢!你是对的。同时,由于我使用了$set,externalId字段的类型被强制转换为OID,因此无法再推送。删除用户文档并创建一个新文档后,现在使用$push或$addToSet,它就可以正常工作了。