2015-11-05 47 views
0

我通過互聯網上的大量資源閱讀,並遵循大量關於如何在特定日期範圍內查找集合的示例,但它沒有奏效。我的代碼如下: -流星db.find與json中的日期作爲選擇器不工作

var fromAge = 18; 
var toAge = 22; 
Meteor.users.find({:profile.birthday":{$lt: new Date(new Date().setYear(new Date().getFullYear() - fromAge)), $gt: new Date(new Date().setYear(new Date().getFullYear() - toAge))}).fetch(); 

上面的查詢返回一個空的集合,當我做一個簡單的Meteor.users.find()獲取()的一個記錄在其下方並返回: - 。

{"_id": 123452345, "profile.birthday": ISODATE("1975-10-22T00:00:00Z")} 

調試,我也寫在javascript控制檯以及後端服務器mongo外殼以下的查詢,它也沒有返回空集合。

JavaScript控制檯

Meteor.users.find({"profile.birthday": {$lt: new Date()}}) 

服務器的MongoDB殼牌

db.users.find{"profile.birthday": {$lt: new Date()}}) 

我不知道現在。如果有人能夠啓發我,那將是非常棒的。

- UPDATE -

我想下面的查詢,它沒有返回任何結果

db.users.find({"profile.birthday":{$lt: new Date(new Date().setYear(new Date().getFullYear() - 18)).toISOString()}}) 

我在JavaScript控制檯

new Date(new Date().setYear(new Date().getFullYear() - 18)).toISOString() 

命令類型的,它確實告訴我

"1997-11-06T16:35:28.844Z" 

而且它是我的數據庫,生日的記錄應該是「1975-10-22T00:00:00Z」,因此它應該打這個記錄,但我所能擁有的只是一個空的集合。

有人告訴我使用ISODate(),我嘗試了下面的命令,它在MongoDB Shell中工作,但它產生ISODate未定義在我的Meteor幫助函數中。

db.users.find({"profile.birthday":{$lt: ISODate("1977-11-06")}) 

讀過將向您介紹一些其他資源(Inserting and Querying Date with MongoDB and Nodejs),並得知我應該使用日期,而不是ISODate因此ISODate是內部的MongoDB和流星有利於做日期到ISODate轉換。然後我試圖硬編碼查詢和它沒有正常工作: -

db.users.find({"profile.birthday": {$lt: new Date("1977-11-06T00:00:00.000Z")}}) 

- UPDATE BEGIN(二〇一五年十一月一十六日) -

它正常工作,而我的問題是,我想建立JSON的選擇,然後把它放到雖然這不會工作,查找: -

selector={"profile.birthday": {$lt: new Date("1977-11-06T00:00:00:000Z"}}; 
db.users.find(selector); 

上面的查詢返回的什麼都沒有。

- 更新的最終(2015年11月16日) -

我這樣做,因爲我有年齡組的下拉列表,我試圖構建查詢通的輔助活動。下面我有一個下拉的模板: - /client/ageRangeDropdown.html

<template name="AgeRangeDropdown"> 
    <div class="btn-group"> 
    Age Group 
    <select id="ageRangeDropdownList" class="form-control"> 
     <option >Whatever</option> 
     <option >18-22</option> 
     <option >23-27</option> 
     <option >28-32</option> 
     <option >33-37</option> 
     <option >38-42</option> 
     <option >43-47</option> 
     <option >48-52</option> 
     <option >53-57</option> 
    </select> 
    </div> 
    {{#each currentCriterias}} 
    <span class="label label-info">{{criteria}}</span> 
    {{/each}} 
    {{#each myUser}} 
    {{profile.firstName}} , {{profile.lastName}}, {{profile.birthday}} 
    {{/each}} 
</template> 

及以下

/client/ageRangeDropdown.js

Template.ageRangeDropdown.events({ 
    'change ageRangeDropdownList': function(e) { 
    for (var key in target) { 
    if (!target.hasOwnProperty(key)) { 
     if (key=='id') { 
     id = target[key]; 
     } 
    } 
    } 
    var value = target.options[target.selectedIndex].value; 
    if (value!='Whatever') { 
    currentCriterias.push({id: "profile.birthday", criteriaValue: value}); 
    } 
    var query = []; 
    for (var i = 0; i < items.length; i++) { 
    var itemObject = {}; 
    var fromAge = currentCriterias[i]['criteriaValue'].substr(0,2); 
    var toAge = currentCriterias[i]['criteriaValue'].substr(3,2); 
     itemObject['profile.birthday'] = { 
     $gt: new Date(new Date().setYear(new Date().getFullYear() - fromAge)), 
     $lt: new Date(new Date().setYear(new Date().getFullYear() - toAge)) 
     } 
    query.push(itemObject); 
    } 
    var selector = []; 
    selector.push({$or: query}); 
    Template.instance().selector.set({$or: selector}); 

    return false; 
}) 

Templage.ageRangeDropdown.created = function() { 
    var instance = this; 
    instance selector = new RactiveVar([]); 

    instance.autorun(function() { 
    var selector = instance.selector.get(); 
    if (typeof selector != 'undefined' && Object.keys(selector).length > 0) { 
     var subscription = instance.subscribe('searchUser', selector); 
    } 
    }); 

    instance.myUser = function() { 
    var selector = instance.selector.get(); 
    if (typeof selector != 'undefined' && Object.keys(selector).length > 0) { 
     return Meteor.users.find(selector, {fields: {profile: 1}}); 
    } 
    } 
} 

服務器/ serverpublish.js

助手
Meteor.publish("searchUser", function(selector){ 
    if (!this.userId) { 
     console.log("Cannot search User when you haven't logged in."); 
     return null; 
    } else { 
     if (typeof selector != 'undefined' || Object.keys(selector).length > 0) { 
     var user=Meteor.users.find(selector, {fields: {profile: 1}}); 
     return user; 
     } else { 
     console.log("won't publish all user profiile when no selector is given"); 
     return null; 
     } 
    } 
}); 

邏輯就是這樣,實際上我有很多下拉每個wh ich將構成查詢的一部分,我使用實例反應變量設置查詢,以便每當它發生變化時,流星將再次執行meteor.find。除了這個生日是一個日期,每個下拉菜單都可以正常工作。任何人都知道發生了什麼問題?

+0

所有這一切都在你的數據庫中包含所需的用戶的理念前提。你有什麼證據表明它的確存在?此外,您是否將其中的任何一項發佈給客戶?你的問題的表述方式,聽起來像'Meteor.users.find()。count()'將在客戶端返回1,並且這個記錄超出了你的日期範圍。 –

+0

這就是因爲我已經手動輸入一個測試記錄到數據庫的生日在18-22年齡範圍內。 '{「_id」:123452345,「profile.birthday」:ISODATE(「1975-10-22T00:00:00Z」)}'。但是我無法獲得查詢的格式來返回這條記錄。 – frankcheong

+0

而問題是我無法在服務器mongodb外殼上找到這條記錄,因此我很確定問題出在查詢本身。 – frankcheong

回答

0

提示:

嘗試在MongoDB的外殼下面的查詢格式。

db.users.find( 
    {"profile.birthday":{ 
     $gte: ISODate(fromAge), 
     $lt: ISODate(toAge) 
    } 
}) 

fromAgetoAge應該是正確的格式。

+0

這是否意味着將var fromAge = new Date(new Date()。setYear(new Date()。getFullYear() - 18)); var toAge = new Date(new Date()。setYear(new Date()。getFullYear() - 22)); db.users.find({「profile.birthday」:{$ gte:ISODate(toAge.toISOString()),$ lt:ISODate(fromAge.toISOString())}}); – frankcheong

+0

@frankcheong當你做這樣的查詢時: 'db.users.find()'在mongoshell中有什麼結果? – inspired

+0

在mongoshell中做db.users.find()確實返回了很多記錄,包括我的目標記錄。我發現我需要在我的流星應用程序中使用Date,而流星將執行Date到ISODate的轉換。雖然我的問題是我有很多下拉列表,每個構成查詢的一部分。所有下拉菜單都正常工作,但我無法獲得該年齡段的下拉菜單。 – frankcheong