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

时间:2017-09-13 06:20:32

标签: node.js mongodb mongoose database

我正在使用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 }这样的控制台,并且值不能更新到收藏中。 请帮帮我怎样才能解决这个错误。 提前谢谢。

2 个答案:

答案 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);
        });
    }
});