- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个应用程序,使用 Node.js 和 MongooseJS 作为处理数据库调用的中间件。
我的问题是我有一些嵌套模式,其中一个以错误的方式填充。当我跟踪人口的每一步时 - 所有数据都很好,除了 devices
数组,它是空的。我仔细检查了数据库,该数组中有数据,所以应该没问题。
我有 Room
架构。 Room
的每个对象都有一个名为 DeviceGroups
的字段。该字段包含一些信息,其中之一是名为 Devices
的数组,该数组存储分配给父房间的设备。
如您在代码中所见,我正在根据向服务器请求的 ID 查找房间。一切都很好,数据与数据库中的数据一致。问题是 devices
数组是空的。
这是 MongooseJS 的某种怪癖,还是我在这里做错了什么,devices
数组返回为空?我检查了数据库本身,里面有一些数据,所以数据没问题,错误在粘贴的代码中。
代码:
模式:
const roomSchema = Schema({
name: {
type: String,
required: [true, 'Room name not provided']
},
deviceGroups: [{
type: Schema.Types.ObjectId,
ref: 'DeviceGroup'
}]
}, { collection: 'rooms' });
const deviceGroupSchema = Schema({
parentRoomId: {
type: Schema.Types.ObjectId,
ref: 'Room'
},
groupType: {
type: String,
enum: ['LIGHTS', 'BLINDS', 'ALARM_SENSORS', 'WEATHER_SENSORS']
},
devices: [
{
type: Schema.Types.ObjectId,
ref: 'LightBulb'
},
{
type: Schema.Types.ObjectId,
ref: 'Blind'
}
]
}, { collection: 'deviceGroups' });
const lightBulbSchema = Schema({
name: String,
isPoweredOn: Boolean,
currentColor: Number
}, { collection: 'lightBulbs' });
const blindSchema = Schema({
name: String,
goingUp: Boolean,
goingDown: Boolean
}, { collection: 'blinds' });
数据库调用:
Room
.findOne({ _id: req.params.roomId })
.populate({
path: 'deviceGroups',
populate: {
path: 'devices'
}
})
.lean()
.exec(function(err, room) {
if (err) {
res.send(err);
} else {
room.deviceGroups.map(function(currentDeviceGroup, index) {
if (currentDeviceGroup.groupType === "BLINDS") {
var blinds = room.deviceGroups[index].devices.map(function(currentBlind) {
return {
_id: currentBlind._id,
name: currentBlind.name,
goingUp: currentBlind.goingUp,
goingDown: currentBlind.goingDown
}
});
res.send(blinds);
}
});
}
})
最佳答案
这是使用 discriminator 的示例能够在单个数组中使用多个模式的方法。
const roomSchema = Schema({
name: {
type: String,
required: [true, 'Room name not provided']
},
deviceGroups: [{ type: Schema.Types.ObjectId, ref: 'DeviceGroup' }]
});
const deviceGroupSchema = Schema({
parentRoom: { type: Schema.Types.ObjectId, ref: 'Room' },
groupType: {
type: String,
enum: ['LIGHTS', 'BLINDS', 'ALARM_SENSORS', 'WEATHER_SENSORS']
},
devices: [{ type: Schema.Types.ObjectId, ref: 'Device' }]
});
// base schema for all devices
function DeviceSchema() {
Schema.apply(this, arguments);
// add common props for all devices
this.add({
name: String
});
}
util.inherits(DeviceSchema, Schema);
var deviceSchema = new DeviceSchema();
var lightBulbSchema = new DeviceSchema({
// add props specific to lightBulbs
isPoweredOn: Boolean,
currentColor: Number
});
var blindSchema = new DeviceSchema({
// add props specific to blinds
goingUp: Boolean,
goingDown: Boolean
});
var Room = mongoose.model("Room", roomSchema );
var DeviceGroup = mongoose.model("DeviceGroup", deviceGroupSchema );
var Device = mongoose.model("Device", deviceSchema );
var LightBulb = Device.discriminator("LightBulb", lightBulbSchema );
var Blind = Device.discriminator("Blind", blindSchema );
// this should return all devices
Device.find()
// this should return all devices that are LightBulbs
LightBulb.find()
// this should return all devices that are Blinds
Blind.find()
在集合中,您将在每个设备上看到 __t
属性根据使用的模式(灯泡或百叶窗)使用值
我还没有尝试过代码,也有一段时间没有使用 Mongoose 了,但我希望它能起作用:)
更新 - 经过测试的工作示例
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var util = require('util');
const roomSchema = Schema({
name: {
type: String,
required: [true, 'Room name not provided']
},
deviceGroups: [{ type: Schema.Types.ObjectId, ref: 'DeviceGroup' }]
});
const deviceGroupSchema = Schema({
parentRoomId: { type: Schema.Types.ObjectId, ref: 'Room' },
groupType: {
type: String,
enum: ['LIGHTS', 'BLINDS', 'ALARM_SENSORS', 'WEATHER_SENSORS']
},
devices: [{ type: Schema.Types.ObjectId, ref: 'Device' }]
});
// base schema for all devices
function DeviceSchema() {
Schema.apply(this, arguments);
// add common props for all devices
this.add({
name: String
});
}
util.inherits(DeviceSchema, Schema);
var deviceSchema = new DeviceSchema();
var lightBulbSchema = new DeviceSchema({
// add props specific to lightBulbs
isPoweredOn: Boolean,
currentColor: Number
});
var blindSchema = new DeviceSchema();
blindSchema.add({
// add props specific to blinds
goingUp: Boolean,
goingDown: Boolean
});
var Room = mongoose.model("Room", roomSchema );
var DeviceGroup = mongoose.model("DeviceGroup", deviceGroupSchema );
var Device = mongoose.model("Device", deviceSchema );
var LightBulb = Device.discriminator("LightBulb", lightBulbSchema );
var Blind = Device.discriminator("Blind", blindSchema );
var conn = mongoose.connect('mongodb://127.0.0.1/test', { useMongoClient: true });
conn.then(function(db){
var room = new Room({
name: 'Kitchen'
});
var devgroup = new DeviceGroup({
parentRoom: room._id,
groupType: 'LIGHTS'
});
var blind = new Blind({
name: 'blind1',
goingUp: false,
goingDown: true
});
blind.save();
var light = new LightBulb({
name: 'light1',
isPoweredOn: false,
currentColor: true
});
light.save();
devgroup.devices.push(blind._id);
devgroup.devices.push(light._id);
devgroup.save();
room.deviceGroups.push(devgroup._id);
room.save(function(err){
console.log(err);
});
// Room
// .find()
// .populate({
// path: 'deviceGroups',
// populate: {
// path: 'devices'
// }
// })
// .then(function(result){
// console.log(JSON.stringify(result, null, 4));
// });
}).catch(function(err){
});
关于javascript - 填充后 MongooseJS 返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47932144/
这是我的 mongoosejs 架构。我将 name unique 设置为 false,但这就是我得到的: MongoError: insertDocument::引起的::11000 E11000
在进行任何类型的验证之前,我需要清理 MongooseJS 中的字符串。如何访问模型的字段并更改(清理)该字段,然后才对该字段进行验证? 例如,这就是我的模型的样子: var Notification
我找到了多篇文章和指南,称赞使用 populate() 方法在 Mongoose 和 MongoDB 中进行连接的能力。 这让我很困惑。如果你想做连接,你不应该使用 SQL 数据库吗?加入 Mongo
目前我有以下方案模型: var userModel = mongoose.schema({ images: { public: [{url: {type: String}}]}
如何对不同的查询进行排序我试过这个 exports.categories = function(req, res) { Article.distinct({'categories' : tru
我看过this功能。 我可以看到它生成了一个slug,但我不太明白它是如何工作的。在 327 行,它返回来自 Model.findOne 函数的 promise ,但在该 Model.findOne
不知何故,在 mongoose 官方网站上很难找到信息。我想知道有没有教程或引用网站? 另外,一个特殊的问题是,如何在 mongoose 中运行 update() 。 :) 最佳答案 我在一个项目中使
我想知道是否有办法限制(子)文档中的元素数量。在我的应用程序中,可以使用 ajax 将元素添加到子文档,因此防止恶意用户添加大量可笑的条目很重要。 我能想到一种方法,就是查询父文档,检查子文档中的元素
假设我有一个文档,例如:var doc = Model.findOne({name:"name"}); 现在,如果文档通过数据库的另一个连接进行编辑,则 doc 不包含正确的信息。我确实需要它,所以我
我有如下 MongooseJS 模式: var UserSchema = new Schema({ name : String, app_key
我想我在使用 mongoosejs 时遇到了麻烦。我试图将一个对象数组保持在特定大小 2。调用此函数时,它会向数组添加一个项目,并在必要时将其缩小。但是,当我保存数组时,大小不会缩减为 2。按照代码和
目前我在引用对象中的文本索引时遇到问题这是代码 架构 var UserSchema = new mongoose.Schema({ username: String, fullname
我有一个用于 Lists 的 MongooseJS 架构,其中每个列表都包含一个 ListItems 数组。每个 ListItem 只是对 Item 的引用和 isSelected 的标志。像这样:
我正在尝试填充嵌套在其他引用中的引用。我已经可以工作了,但看起来有点老套,想知道是否还有其他方法可以实现这一点: return Q.ninvoke(BoardSchema, 'find', {'_id
使用 Mongoose 作为 NodeJS 的 ODM,但不完全理解错误处理的工作原理。它可以工作,但看起来不正确,并且不符合文档,所以我担心走这条路以后会困扰我。 例如,以下是基本登录路线: app
我是 mongodb 和 mongoose 的新手,我在获取子子数组时遇到了麻烦。 我的数据是这样的: [ {_id : ..., name : 'Category nam
Request.findOne({_id: id}).populate("user").exec(function(err, request) { if (!err) { re
假设我有一个如下所示的 ABC 架构: ABC = mongoose.Schema ({ name: String , x: String , y: String ,
这个问题已经有答案了: How do you turn a Mongoose document into a plain object? (9 个回答) mongoose .find() method
我正在编写一个应用程序,使用 Node.js 和 MongooseJS 作为处理数据库调用的中间件。 我的问题是我有一些嵌套模式,其中一个以错误的方式填充。当我跟踪人口的每一步时 - 所有数据都很好,
我是一名优秀的程序员,十分优秀!