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 数组创建子文档的主要内容,如果未能解决你的问题,请参考以下文章
用于存储子文档的 JSON 对象数组的 Mongoose 模式
Mongoose:如何将子文档中的数组提取到父文档中的单个数组中