使用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"
然后通过使用第二个参数的_id
find子文档:
"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) })