使用mongoose更新mongoDb中数组内部的对象

我正在MongoDB中处理MongoDB集合中的数组内部的更新对象值。

我的collections就像

{ "_id": ObjectId("59b7e839200a5c00ee2d2851"), "player": "New", "playesList": [ { "_id": ObjectId("59b2a4f749fee40959e556d3"), "name": "abcd", }, { "_id": ObjectId("59b2a4f749fee40959e556d4"), "name": "pqrs", } ] } 

现在我想更新ID为59b2a4f749fee40959e556d3 (我的意思是当前第一个玩家的名字是abcd),玩家的名字是59b7e839200a5c00ee2d2851 ,玩家New

所以我试图用这个查询更新

 play.update( { '_id': '59b7e839200a5c00ee2d2851', 'player': 'new', 'playesList._id': '59b2a4f749fee40959e556d3' }, { '$set': { 'playesList.$.name': 'wxyz' } }, function(error, success) { console.log(error, success); } ) 

但是在这里我得到了像null { ok: 1, nModified: 0, n: 0 }这样的控制台null { ok: 1, nModified: 0, n: 0 }并且值不能更新到集合中。 请帮助我如何解决这个错误。 先谢谢你。

 play.findById('59b7e839200a5c00ee2d2851', (err, item) => { // Handle any possible database errors if (err) { res.status(500).send(err); } else { item.playesList.$.name = 'wxyz' // Save the updated document back to the database item.save((err, updated_item) => { if (err) { res.status(500).send(err) } res.status(200).send(updated_item); }); } }); 

MongoDB集合中的数组内的对象(文档)称为子文档

在这种情况下,要使用自己的_id更新特定的子文档,可以使用Mongoose findOneAndUpdate方法:

 play.findOneAndUpdate({ "_id": "59b7e839200a5c00ee2d2851", "playesList._id": "59b2a4f749fee40959e556d3" }, { "$set": { "playesList.$.name": "something" } }, function(error, success) { }) 

首先你需要find收集文件:

 "_id": "59b7e839200a5c00ee2d2851" 

然后通过使用第二个参数的_idfind子文档:

 "playesList._id": "59b2a4f749fee40959e556d3" 

并且当您find要更新的子文档时,使用$ set操作符来设置新值以查找find的子文档的属性:

 "$set": { "playesList.$.name": "something" } 

请注意, findOneAndUpdate返回更新文档的以前状态。

工作示例:

 var express = require('express') var app = express() var router = require('express').Router() var mongoose = require('mongoose') var Schema = mongoose.Schema mongoose.connect('mongodb://localhost:27017/stackoverflowanswer') mongoose.Promise = global.Promise var PlayerSchema = new Schema({ play: String, playersList: [{ name: String }] }) var Player = mongoose.model('Players', PlayerSchema) app.use('/', router) router.get('/add-player', function(req, res, next) { var player = new Player() player._id = "59b7e839200a5c00ee2d2851" player.play = "New" player.playersList.push({ _id: "59b2a4f749fee40959e556d3", name: "abcd" }, { _id: "59b2a4f749fee40959e556d4", name: "pqrs" }) player.save(function(err) { if (err) throw err res.json({ message: 'Success' }) }) }) router.get('/update-player', function(req, res, next) { Player.findOneAndUpdate({ "_id": "59b7e839200a5c00ee2d2851", "playersList._id": "59b2a4f749fee40959e556d3" }, { "$set": { "playersList.$.name": "wxyz" } }, function(error, success) { if (error) throw error res.json({ message: 'Success' }) }) }) app.listen(8080, function() { console.log('Node.js listening on port ' + 8080) })