2015-02-24 77 views
0

我有一個非常(至少對我來說)使用Mongoose的複雜查詢。複雜的查詢與貓鼬,包括子文檔,附近的條件,

首先我所有的架構:

var ObjectSchema = new Schema({ 
    pickupStartDate: {type: Date, required: true, default: Date}, 
    pickupEndDate: {type: Date, required: true, default: Date}, 

    ... 

    handoverStartDate: {type: Date, required: true, default: Date}, 
    handoverEndDate: {type: Date, required: true, default: Date}, 

    ... 
}); 

通過使用「插件機制」我的目標有兩個地址(稱爲pickupAddresshandoverAddress地址看起來像這樣:

var name = 'address'; 

var obj = {}; 
obj[name] = { 
    street: String, 
    zipCode: String, 
    city: String, 
    state: String, 
    country: String, 
    loc: {type: [Number], index: '2dsphere'} 
}; 
schema.add(obj); 

而其他架構:

var TripSchema = new Schema({ 
    startDate: {type: Date, required: true, default: Date}, 
    endDate: {type: Date, required: true, default: Date}, 
    handoverRadius: {type: Number, required: true} 
}); 

它有一個address(再次使用插件機制)。

我想下面的查詢:

找到所有的「對象」的「配合」到我的行程。 「適合」 是指:

  • handoverStartDate >= trip.startDate
  • handoverEndDate <= trip.endDate
  • `handoverAddress接近trip.address
  • ...

我認爲這將是一個好辦法:

ObjectSchema 
    .find() 
    .and([ 
     { handoverStartDate: {$gte: trip.startDate}}, 
     { handoverEndDate:  {$lte: trip.endDate}}, 
     { 'handoverAddress.loc': {$near: { 
      '$maxDistance': 10 * 1000, 
      '$center': { 
       type: 'Point', 
       coordinates: trip.address.loc 
      } 
     }}} 
    ]) 
    .exec(function(err, cdObjects) { 
     console.log(err); 
     console.log(cdObjects); 
    }); 

但是這會導致以下錯誤:

{ message: 'Cast to number failed for value "[object Object]" at path "handoverAddress.loc"'

我想是因爲'handoverAddress.loc'。但我不知道如何指定,因爲它必須是一個字符串(因爲它是一個子文檔)。

+0

您可以張貼在一個數據庫中的文檔的JSON例子嗎? – 2015-02-24 16:57:02

回答

0

這是它的工作對我來說:

ObjectSchema 
    .where('handoverStartDate').gte(trip.startDate) 
    .where('handoverEndDate').lte(trip.endDate) 
    .where('handoverAddress.loc').near({ 
     center: { 
      type: 'Point', 
      coordinates: trip.address.loc 
     }, 
     maxDistance: 10 * 1000 
    }); 
1

你不需要和。嘗試

ObjectModel.find({ 
    handoverStartDate: {$gte: trip.startDate}, 
    handoverEndDate:  {$lte: trip.endDate}, 
    'handoverAddress.loc': { 
    $near: { 
     $geometry: { 
     type: "Point", 
     coordinates: trip.address.loc 
     }, 
     $maxDistance: 10 * 1000 
    } 
}) 

確保trip被定義爲變量,並且startDate,endDate和address都是定義的符合您期望的屬性。