Mongoose 不会从 JSON 数组创建子文档

Posted

技术标签:

【中文标题】Mongoose 不会从 JSON 数组创建子文档【英文标题】:Mongoose doesn't create subdocument from JSON array 【发布时间】: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);
    );
  

【问题讨论】:

【参考方案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 不支持这个有点令人失望...

以上是关于Mongoose 不会从 JSON 数组创建子文档的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 中的另一个数组创建子数组?

jquery或JS创建子元素并分配一个ID [重复]

用于存储子文档的 JSON 对象数组的 Mongoose 模式

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

如何根据 mongoose 中嵌套 JSON 文档中数组字段的日志日期获取最新日志记录

Node.js/mongoose - 数组中的子文档不会删除/移除