2016-12-04 60 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); 
     } 
    } 
}