2016-12-04 107 views
0

我有2個系列:bookingstimeslotsMongoDB中2個不同集合之間的鍵值交集

models/booking.js:

var mongoose = require ('../config/db'); 
var Schema = require('mongoose').Schema; 
var ObjectId = Schema.ObjectId; 

var bookingSchema = new Schema({ 
    start: { 
     type: Number, 
     required: true 
    }, 
    end: { 
     type: Number, 
     required: true 
    }, 
    date: { 
     type: Date, 
     required: true, 
     default: Date.now 
    } 
}); 

models/time_slot.js:

var mongoose = require ('../config/db'); 
var Schema = require('mongoose').Schema; 
var ObjectId = Schema.ObjectId; 

var timeSlotSchema = new Schema({ 
    start: { 
    type: Number, 
    required: true 
    }, 
    end: { 
    type: Number, 
    required: true 
    }, 
    date: { 
    type: Number, 
    required: true, 
    default: Time.Today 
    }, 
    enabled: { 
    type: Boolean, 
    required: true, 
    default: true, 
    }, 
    pickup: { 
    type: Boolean, 
    required: true, 
    default: true, 
    } 
}); 

兩者有一個共同的領域start。我希望能夠從timeslots中獲得start的值出現在bookings中的條目。

我曾嘗試:

controllers/time_slot.js:

var timeSlotModel = require('../models/time_slot').model; 
var Booking = require('./booking'); 

Booking.getBookings({}, function(err, bookings) { 
    if (err) { 
    console.error(err); 
    } else { 
    timeSlotModel.find({start: bookings.start}, function(err, slots) { 
     if (err) { 
     console.error(err); 
     } else { 
     return next(null, slots); 
     } 
    } 
} 

但是,這並不工作,勿庸置疑,而我得到的錯誤:

MongooseError: Cast to number failed for value "undefined" at path "start" 
+0

can y你還向我們展示'getBookings'方法? – drinchev

+1

是預訂數組?因爲那樣.start不會是字段 –

+0

你能告訴我們'TimeSlot'模型嗎? – ZeMoon

回答

0

你可以這樣說:

Booking.getBookings({}, function(err, bookings) { 
    if (err) { 
    console.error(err); 
    } else { 

    // build array with unique "start" values from bookings 
    var starts = bookings 
     .map(booking => booking.start) 
     .filter((val, i, self) => self.indexOf(val) === i) 

    // find by these start values 
    var query = {start: {$in: starts}} 

    timeSlotModel.find(query, function(err, slots) { 
     if (err) { 
     console.error(err); 
     } else { 
     return next(null, slots); 
     } 
    } 
}