2017-12-06 13 views
1

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); 
    }); 
}); 

答えて

0

。ここにシンプルで効果的なコードスニペットがあります。

Room.findById(req.params.id) 
.select("roomname") 
.populate({ 
    path: 'deviceGroup', 
    select: 'devicename', 
    model:'DeviceGroups' 
    populate:{ 
     path: 'device', 
     select: 'devicename', 
     model:'Device' 
     } 
}) 
.lean() 
.exec((err, data)=>{ 
    console.log(data); 
}) 
+0

本当に申し訳ありませんが、私は何とか現在のコードを投稿することを忘れてしまいました。あなたの現在のコードをリスペクトしていますが、まだ投稿に追加されています。 –

+0

マップ内のデータベースを照会するのは良い方法ではありません。同じことを行う。 mongooose populateについてもっと読む。 2番目のネストされた人口をスキップすることができます – shivshankar

+0

ありがとう!私のニーズに合うように 'populate'メソッドの呼び出しを変更しましたが、あなたの実装は私にとって完璧です!私はpopulateメソッドに関するmongooseのドキュメントを読んだが、それはまだ私のために少し混乱していた。今はすべてが完全にはっきりしています。 –

関連する問題