从Meteor中的日期范围搜索返回结果

时间:2016-11-15 21:44:52

标签: mongodb meteor mongodb-query

在我的Meteor.users集合中,我有一个对象数组,如下所示:

enter image description here

我需要为所有用户搜索所有这些内容,然后返回timestamp在我指定的日期范围内的对象。

我尝试过这样做,但它会返回整个用户对象,而不是shortURLs中指定日期之间的特定对象:

Meteor.users.find({'shortURLs.timestamp': { $gte : new Date(1478995200000), $lt: new Date(1479254400000) } }).fetch();

我也尝试了这个,它为shortURLs的用户提供了一个包含所有对象的数组,不幸的是,这些对象不仅仅是指定日期之间的对象(我使用的是underscore.js _.chain):

var start = new Date(1478995200000);
var end = new Date(1479254400000);
_.chain(Meteor.users.find({'shortURLs.timestamp': { $gte : start, $lt: end } }).map(function (users) { return { url: users.shortURLs} })).pluck('url').flatten().uniq().value();

对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用投影将子文档返回的结果限制为与您的查询匹配的结果。

<div ng-repeat="i in [0,1]" class="column_{{ i }}">
  <div ng-repeat="thing in things" ng-if="$even == ( i == 0 )">
    {{thing.name}}
  </div>
</div>

如果我想更紧凑地执行此操作,我会将查询重用为以下投影:

let start = new Date(1478995200000), end = new Date(1479254400000);
let results = Meteor.users.find(
  { 'shortURLs.timestamp': { $gte: start , $lt: end }},
  { fields: { shortURLs: { $elemMatch: { timestamp: { $gte: start , $lt: end }}}}}
  ).fetch();

在您找到匹配的文档后,投影基本上会显示,只会让我回到投影中指定的内容。

答案 1 :(得分:0)

以下是它的工作原理......如果任何shortURL符合您的标准,Mongo将返回您的用户记录。正如您所观察到的,它为您提供了整个用户记录,而无需过滤shortURL数组。

您构建数据的方式并不容易实现。您可以执行查询,然后迭代数据以提取您想要的内容,或者重新构建数据以将shortURL放在单独的集合中,并引用每个记录中的用户ID。如果你这样做,那么获得你想要的东西变得非常容易(也很有效率)。

Meteor用户集合有点特殊,不建议在其中添加其他数据,因为当用户获得新的登录令牌时会重新写入。因此,将这些数据提取到另一个集合中可能是一个好主意,特别是如果您希望在写入记录时给它们加上时间戳。