【问题标题】:Mongoose doesn't create subdocument from JSON arrayMongoose 不会从 JSON 数组创建子文档
【发布时间】:2016-11-26 19:00:44
【问题描述】:

我正在尝试将包含一级数据和数组的 JSON 对象写入 MongoDB。

相反,所有第一级数据都被存储,但数组中包含的任何内容都没有。在记录服务器接收到的数据时,我看到了整个对象,这让我相信我的 Mongoose 代码有问题。

例如,如果我发送这样的内容:

issueId: "test1",
issueTitle: "testtest",
rows: [
  {order:1,data: [object]},
  {order:2,data: [object]},
]

仅存储以下内容:

issueId: "test1",
issueTitle: "testtest",
lastUpdated: Date,

我有以下 Mongo 模型:

//model.js
var mongoose = require('mongoose');

var model = mongoose.Schema({

  issueId     : String,
  issueTitle  : String,
  lastUpdated : {type: Date, default : Date.now},

  rows  : [{
    order   : Number,
    data      : [
      {
        title   : String,
        text    : String,
        link    : String,
      }
    ]
  }]

});

module.exports = mongoose.model('Model', model);

还有路由代码,我认为问题可能是:

//routes.js
const mongoose = require('mongoose');
const Model = require('./model.js');
...
app.post('/api/data/update', function(req, res) {
  let theData = req.body.dataToInsert;

  console.log(JSON.stringify(theData,null,4));

  Model.findOneAndUpdate(
    {issueId : theData.issueId},
    {theData},
    {upsert: true},
    function(err,doc){
      if(err) throw err;
      console.log(doc);
  });
});

同样,这里是 Angular 控制器中存储数据的部分。我认为这里没有任何问题。

pushToServer = function() {
    $http.post('/api/data/update',{
        dataToInsert : $scope.dataObject,
    }).then(function successCallback(res){
        console.log("all good", JSON.stringify(res,null,3));
    }, function errorCallback(res){
        console.log("arg" + res);
    });
  }

【问题讨论】:

    标签: angularjs json node.js mongodb mongoose


    【解决方案1】:

    看猫鼬FAQ中的第一个问题: http://mongoosejs.com/docs/faq.html

    Mongoose 不会为数组索引创建 getter/setter;没有它们,猫鼬永远不会收到更改通知,因此不知道要保留新值。解决方法是使用 Mongoose >= 3.2.0 中可用的 MongooseArray#set。

    // query the document you want to update
    // set the individual indexes you want to update
    // save the document
    doc.array.set(3, 'changed');
    doc.save();
    

    编辑

    我认为这可以更新所有行。我很想知道它是否有效。

    let rowQueries = [];
    theData.rows.forEach(row => {
        let query = Model.findOneAndUpdate({
            issueId: theData.issueId,
            'row._id': row._id
        }, {
            $set: {
                'row.$': row
            }
        });
        rowQueries.push(query.exec());
    });
    
    Promise.all(rowQueries).then(updatedDocs => {
        // updated
    });
    

    【讨论】:

    • Arg 好的。是否可以将其与当前的模型 API 方法集成?
    • 这是一个很好的问题。我还没有找到在一次更新中更新所有现有rows 的方法。我认为您需要单独更新每一行。我会用一种方法来更新答案。
    • 太棒了,我会试试的。 Mongoose 不支持这个有点令人失望...
    猜你喜欢
    • 2018-03-20
    • 2019-05-08
    • 2017-03-17
    • 2015-07-12
    • 2019-09-13
    相关资源
    最近更新 更多