猫鼬创建一个包含分类子文档的新文档
Mongoose create a new document with catergorized sub documents
我一直在浏览猫鼬文档,我认为我缺少一些关于它如何工作的基本理解。
我想做什么
我正在进行第三方 API 调用,该调用返回的结构
如下所示Route
|__Train 1 on Route
|__Upcoming Station (with ID)
| |__Time to this station
|__Upcoming Station (with ID)
| |__Time to this station
...
|__Train 2
...
我的目标是将其格式化为这样的文档
tableId : String,
stations : [{
stopId : String,
incoming : [{
vehicleId : String,
timeAway : { type: Number, min: 0, max: 3000 },
lastUpdated : { type: Date, default: Date.now }
}]
}],
我目前正在尝试的是浏览每列火车的接收数据,以及每个即将到来的车站,并将预计到达时间插入车站列表中。重要的部分是火车 1 和火车 2 可能都到达给定的车站,我只想要一个具有多个预测的车站元素。问题是,我无法使用更新器进行查找OneAndUpdate,因为该文档尚不存在。
从关于子文档的文档(这里),我尝试了推送和addToSet,但这些只是为每个预测创建一个子文档。例如,我会得到:
[{
stopId: 1234,
incoming : [{
vehicleId : 11,
timeAway : 200
}]
},
stopId: 1234,
incoming : [{
vehicleId : 22,
timeAway : 400
}]
}]
我想得到的地方:
[{
stopId: 1234,
incoming : [{
vehicleId : 11,
timeAway : 200
},{
vehicleId : 22,
timeAway : 400
}]
}]
我觉得我错过了创建此文档的一些基本方面。
对于数据架构,
var StationSchema = new mongoose.Schema({
tableId: String,
stations: [{
stopId: String,
incoming: [{
vehicleId: String,
timeAway: {type: Number, min: 0, max: 3000},
lastUpdated: {type: Date, default: Date.now}
}]
}]
});
通过以下方式保存数据
var s = new Station({
tableId: '2'
});
s.save(function(err) {
结果
{ "_id" : ObjectId("56e68bcf851a00680832ef13"), "tableId" : "2", "stations" : [ ], "__v" : 0 }
我们知道stations
的默认值是空数组,这是猫鼬的设计行为。upsert: true
将添加一个不用于子文档的新文档。
要插入站子文档,我们可以先检查stopId
是否存在,如果没有,则插入新的站子文档。 否则,我们可以将新的incoming
子文档插入到stations
中。以下是示例代码
Station
.findOneAndUpdate({tableId: '2', 'stations.stopId': {$exists: false}},
{$addToSet: {stations: {stopId: '1234', incoming: []}}},
function (err, doc){
if (err)
console.log(err);
else{
Station
.findOneAndUpdate(
{'stations.stopId': 1234},
{$addToSet: {'stations.$.incoming': {vehicleId: 22, timeAway: 400}}},
function(err, doc) {
if (err)
console.log(err);
else
console.log(doc);
});
}
});
相关文章:
- 如何筛选要写入新文档的HTML,删除JavaScript中的某些类和/或ID
- 服务器上的 Meteor.publish 不会在客户端上显示新文档
- 使用JavaScript,我可以上传一个word文件并使用.replaces然后另存为新文档吗
- Indesign:将单元格样式复制到新文档
- 猫鼬创建一个包含分类子文档的新文档
- 不显示带有搜索的重复控件中的新文档
- 仅在 Meteorjs 中添加新文档时更新订阅
- MongoDB:将字段移动到新文档并更新字段和数组
- 在 Couchdb ( 虹膜沙发 ) POST 请求中添加新文档失败,状态为 500
- Mongodb upsert 无法添加新文档
- 使用集合钩子将新文档的 id 添加到现有文档中的数组中
- 如果字段不在新文档中,则更新插入会删除该字段
- 如何知道Mongoose'的追加销售创建了一个新文档
- 让流星重新渲染“;新文档”;
- 如何将样式表粘贴到Rally应用程序中的新文档窗口中
- 流星DDP:当一个新文档被添加到集合中时,如何获得通知
- 从查询组合集合插入一个新文档
- document.open()是创建一个完整的新文档还是只是删除已经存在的文档?
- 如何合并电子表格并在新文档中设置其选项卡顺序
- JavaScript -写入新文档会删除空格