MongoDBを使用しているNode.jsのアプリケーションをコーディングしています。 DB問合せを処理するためにMongooseJSを選択しました。人口とネストされたクエリでのマングースの希薄な使用
Iは、互いに参照される2つのコレクション(Room
コレクション内に含まれる「優れた」コレクションとDeviceGroups
あるRoom
)を有します。
私は、Room
コレクションから部屋のすべてのリストを取得するクエリを持っている(DeviceGroup
コレクションへRooms
参照です)deviceGroups
フィールドを移入し、その中で見つかったすべての部屋を通過map
方法がありますRoom
コレクションであり、すべての部屋で別のクエリを作成します。マップメソッドの現在のルームを参照するDeviceGroup
コレクション内のdeviceGroups
を探します。
私の目標は、deviceGroups
フィールドのすべての客室のリストを参照のみでなく、実際のデータで戻すことです。
質問後(then
メソッド内)の質問は、Mongooseドキュメントです。アルゴリズム全体がGET
メソッドのハンドラとして使用されるので、私は応答として純粋なJavaScriptオブジェクトが必要です。
私が達成したい主な目標は、純粋なjavascriptオブジェクトとしてそれらの中のすべてのクエリと人口の結果を取得することです。応答オブジェクトを作成して送信できます(dbが返すすべてを送信する必要はありません。いないすべてのデータは、このような場合のために必要とされる)
EDIT:
私は申し訳ありませんが、私は私のコードを削除して、それを実現するdidntの。
私の現在のコードは以下の通りです:
スキーマ:
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'
}
]
}, { collection: 'deviceGroups' });
クエリ:あなたが混乱している
app.get('/api/id/rooms', function(req, res) {
Room.find({}).populate('deviceGroups').lean().exec(function(err, parentRoom) {
parentRoom.map(function(currentRoom) {
DeviceGroup.findOne({ parentRoomId: currentRoom._id }, function (err, devices) {
return devices;
});
});
}).then(function(roomList) {
res.send(roomList);
});
});
本当に申し訳ありませんが、私は何とか現在のコードを投稿することを忘れてしまいました。あなたの現在のコードをリスペクトしていますが、まだ投稿に追加されています。 –
マップ内のデータベースを照会するのは良い方法ではありません。同じことを行う。 mongooose populateについてもっと読む。 2番目のネストされた人口をスキップすることができます – shivshankar
ありがとう!私のニーズに合うように 'populate'メソッドの呼び出しを変更しましたが、あなたの実装は私にとって完璧です!私はpopulateメソッドに関するmongooseのドキュメントを読んだが、それはまだ私のために少し混乱していた。今はすべてが完全にはっきりしています。 –