私はあなたのスキーマやクエリを介して実行するための簡単なスクリプトを作成しました:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = mongoose.Types.ObjectId;
mongoose.connect("mongodb://localhost/mytestdb");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
// Schemas copied from your code, condensed to reduce clutter
var DeviceSchema = mongoose.Schema({
deviceName: {type: String, required: true, index: true},
roomCapacity: {type: Number},
roomImagePath: {type: String},
mapId: {type: Schema.Types.ObjectId, ref: 'Map', required: true},
coords: {type: [Number], required: true},
createdAt: {type: Date, default: Date.now}
});
// Omitted ownerId for simplicity sake
var MapSchema = mongoose.Schema({
mapName: {type: String},
mapImagePath: {type: String, required: true},
createdAt: {type: Date, default: Date.now},
devices: [{type: Schema.Types.ObjectId, ref: 'Device'}]
});
var Device = mongoose.model('Device', DeviceSchema);
var Map = mongoose.model('Map', MapSchema);
// Add Map
new Map({
mapName: "Map 1",
mapImagePath: "mapImagePath 1",
createdAt: new Date(),
devices: []
}).save().then(function (map1) {
// Add a Device
return new Device({
deviceName: "Device 1",
roomCapacity: 123,
roomImagePath: "roomImagePath",
mapId: map1._id,
coords: [345, 456]
}).save().then(function (device1) {
// Add the new Device back to the map
map1.devices.push(device1); // Push the whole device, not just the _id, mongoose would handle this for us
return map1.save();
})
}).then(function (saveResult) {
console.log(saveResult);
// mapId is now an ObjectId
var mapId = saveResult._id;
return Map.findOne({_id: mapId}).populate('devices').exec().then(function (foundMap) {
console.log(foundMap);
});
}).catch(function (err) {
console.error(err);
});
});
コンソール出力:
まずにconsole.logはデバイスのオブジェクトIDと、新たに保存された地図が含まれています
{ __v: 1,
mapName: 'Map 1',
mapImagePath: 'mapImagePath 1',
_id: 5771e0e5739d78441cff5424,
devices: [ 5771e0e5739d78441cff5425 ],
createdAt: Tue Jun 28 2016 02:28:53 GMT+0000 }
第二にconsole.logは.findOne()
移入さ:
{ _id: 5771e0e5739d78441cff5424,
mapName: 'Map 1',
mapImagePath: 'mapImagePath 1',
__v: 1,
devices:
[ { _id: 5771e0e5739d78441cff5425,
deviceName: 'Device 1',
roomCapacity: 123,
roomImagePath: 'roomImagePath',
mapId: 5771e0e5739d78441cff5424,
__v: 0,
createdAt: Tue Jun 28 2016 02:28:53 GMT+0000,
coords: [Object] } ],
createdAt: Tue Jun 28 2016 02:28:53 GMT+0000 }
データベースレコードは、データが期待どおりであることを示します.DeviceはMapのObjectIdを格納し、MapはDeviceのObjectIDを「devices」パスの配列に格納しました。
これは、レコードが正しく読み込まれていることを示しています。これは、スキーマとクエリが正しいことを意味しています。
したがって、人口があなたの側でうまくいかない理由を調べる必要があります。
データベース内のデータを最初に確認し、maps
コレクションの "devices"配列にObjectIdが含まれていて文字列が含まれていないことを確認してください。また、ここでは(デフォルトの名前を使用していない場合)
をコレクションが正しく命名され、マップされていることを確認しますと、私のデータベースのテストデータは以下のとおりです。
maps
コレクション:
{
"_id" : ObjectId("5771e0e5739d78441cff5424"),
"mapName" : "Map 1",
"mapImagePath" : "mapImagePath 1",
"devices" : [
ObjectId("5771e0e5739d78441cff5425")
],
"createdAt" : ISODate("2016-06-28T02:28:53.091+0000"),
"__v" : NumberInt(1)
}
devices
コレクション:
{
"_id" : ObjectId("5771e0e5739d78441cff5425"),
"deviceName" : "Device 1",
"roomCapacity" : NumberInt(123),
"roomImagePath" : "roomImagePath",
"mapId" : ObjectId("5771e0e5739d78441cff5424"),
"createdAt" : ISODate("2016-06-28T02:28:53.181+0000"),
"coords" : [
NumberInt(345),
NumberInt(456)
],
"__v" : NumberInt(0)
}
感謝!!!問題は、私はマップを作成し、デバイスは後で作成されます。これどうやってするの?たとえば、マップの作成直後にデバイスを作成しているとします。別の時間にデバイスをマップ配列に配置するにはどうすればよいですか? – unconditionalcoder
デバイスの作成が完了したら、** 1)** 'Map.findById(mapId、" devices ")'、新しいデバイスを 'devices'配列に追加し、' .save() 'を更新する地図;または** 2)** Map.update({_ id:mapId}、{$ addToSet:{"devices":device._id}}) '' – kazenorin