2017-09-13 83 views
0

我正在MongoDB上處理MongoDB集合中數組內部的更新對象值。使用mongoose在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
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); 
     }); 
    } 
}); 
0

對象(文件)MongoDB中收集的陣列內被稱爲 - subdocuments

在這種情況下,用自己的_id更新特定的子文檔,您可以用貓鼬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) 
}) 
+0

請編輯您的答案,並解釋爲什麼這個答案。作爲高分辨率用戶,您應該知道這些答案被標記爲「低質量」。 – loki

相關問題