我正在使用MongoDB获取更新对象值,该值位于MongoDB集合中的数组内。
我的收藏就像
{
"_id": ObjectId("59b7e839200a5c00ee2d2851"),
"player": "New",
"playesList": [
{
"_id": ObjectId("59b2a4f749fee40959e556d3"),
"name": "abcd",
},
{
"_id": ObjectId("59b2a4f749fee40959e556d4"),
"name": "pqrs",
}
]
}
现在我要更新ID为59b2a4f749fee40959e556d3
的播放器的名称(我的意思是第一个播放器名称,目前是abcd),其集合ID为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 }
这样的控制台,并且值不能更新到收藏中。
请帮帮我怎样才能解决这个错误。
提前谢谢。
答案 0 :(得分:1)
MongoDB集合中数组内的对象(文档)称为 - subdocuments
在这种情况下,要使用自己的_id
更新特定的子文档,可以使用Mongoose findOneAndUpdate方法:
play.findOneAndUpdate({
"_id": "59b7e839200a5c00ee2d2851",
"playesList._id": "59b2a4f749fee40959e556d3"
}, {
"$set": {
"playesList.$.name": "something"
}
}, function(error, success) {
})
首先,您需要在集合中找到文档:
"_id": "59b7e839200a5c00ee2d2851"
然后使用第二个参数
找到_id
的子文档
"playesList._id": "59b2a4f749fee40959e556d3"
当您找到要更新的子文档时,使用$set运算符将新值设置为找到的子文档的name
属性:
"$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)
})
答案 1 :(得分: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);
});
}
});