MongoDB:如何使用Mongoose添加或更新SubDocument?

我试图添加一个新的或基于它的存在更新现有的SubDocument。

鉴于以下架构:

var providerSchema = new Schema({ provider: String, id: String, accessToken: Object }) var userSchema = new Schema({ email: { type: String }, provider: [providerSchema], created_at: Date, updated_at: Date }); 

以下文档被存储:

  { "_id": { "$oid": "5629f57b13bc066c17b88a0d" }, "created_at": { "$date": "2015-10-23T08:53:15.684Z" }, "updated_at": { "$date": "2015-10-23T08:53:15.684Z" }, "email": "123123123@gmail.com", "provider": [ { "provider": "facebook", "id": "123123", "accessToken": { "expires_in": 123123, "token_type": "bearer", "access_token": "123123123" }, "_id": { "$oid": "5629f57b13bc066c17b88a0e" } }, { "accessToken": { "access_token": "123123", "token_type": "bearer", "uid": "123123" }, "id": "123123", "provider": "dropbox", "_id": { "$oid": "5629f58813bc066c17b88a12" } } ], "__v": 0 } 

我正在尝试更新或添加以下代码的新的SubDocument:

 User.findOneAndUpdate({email: email}, { "$push" : { "provider": { "provider": "dropbox", "id": "123441212", "accessToken": "sdasddad" } } }, function (error, doc) { .... }}); 

不幸的是,现有的子文档不会更新,但会创build新的子文档。

你可以帮我吗?

提前致谢!

Ps是否可以命名为SubDocuments? 所以例如有一个名为“Facebook”的SubDocument可以直接通过名称访问?

—解决scheme—

 User.findOne( {"email": email}) .populate("provider") .exec(function (err, data) { if(data === null && typeof data === "object"){ // Create User user.save(function (error) { if(error) return callback(new Error(error), null); return callback(null, user); }) } else { // if(err) return callback(new Error(err), null); var prov = _.findWhere(data.provider, { "provider": provider }); if(typeof variable_here === 'undefined'){ data.provider.push(update); } else { _.extend(prov, update); } data.save(function (error) { if(error) { return callback(error, null); } else { return callback(null, data); } }); } } ); 

谢谢Hossein Gerami! 还有很多的后备…

(我首先用“_.findWhere”挣扎;它是下划线;只需通过“npm install underscore –save”安装,并在你的文件“var _ = require('underscore');”

你可以试试这个 我认为这可能工作。

  User.update({email: email,provider.provider:'dropbox'},{$set:{"provider.$": {"provider": { "provider": "dropbox", "id": "123441212", "accessToken": "sdasddad" }}}},function(error, doc){ ... }}); 

请考虑学生系列中的以下文档,其成绩元素值是embedded式文档的数组:

  { _id: 4, grades: [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 90, mean: 85, std: 3 } ] } 

使用位置$操作符更新embedded式文档中std字段的值,分数为85:

  db.students.update( { _id: 4, "grades.grade": 85 }, { $set: { "grades.$.std" : 6 } } ) 

下面的代码是以下更新的完整语法,如果您将upsert定义为true,则会插入新logging,否则将更新它。 默认值:false

  db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 

—解决scheme—

 User.findOne( {"email": email}) .populate("provider") .exec(function (err, data) { if(data === null && typeof data === "object"){ // Create User user.save(function (error) { if(error) return callback(new Error(error), null); return callback(null, user); }) } else { // if(err) return callback(new Error(err), null); var prov = _.findWhere(data.provider, { "provider": provider }); if(typeof variable_here === 'undefined'){ data.provider.push(update); } else { _.extend(prov, update); } data.save(function (error) { if(error) { return callback(error, null); } else { return callback(null, data); } }); } } ); 

谢谢Hossein Gerami! 还有很多的后备…

(我首先用“_.findWhere”挣扎;它是下划线;只需通过“npm install underscore –save”安装,并在你的文件“var _ = require('underscore');”