使用 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 中更新数组内的对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用mongoose在mongoDB中更新数组的数组

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

MongoDB(Mongoose)更新数组数组中的元素

如何在 mongoose 和 mongodb 中更新嵌套模型

通过在 body、mongoose/mongodb 中提供文档来更新多个文档

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]