使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]
Posted
技术标签:
【中文标题】使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]【英文标题】:Update object inside the array in mongoDb using mongoose [duplicate] 【发布时间】:2018-02-21 17:29:48 【问题描述】:我正在使用 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
这样的控制台,并且值无法更新到集合中。
请帮助我如何解决此错误。
提前谢谢你。
【问题讨论】:
【参考方案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/***answer')
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)
)
【讨论】:
请编辑您的答案并解释为什么这会回答问题。作为高级用户,您应该知道此类答案被标记为“低质量”。【参考方案2】: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);
);
);
【讨论】:
以上是关于使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?
如何在 mongoose 和 mongodb 中更新嵌套模型