在我的Meteor.users集合中,我有一个对象数组,如下所示:
我需要为所有用户搜索所有这些内容,然后返回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();
对此的任何帮助将不胜感激。
答案 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用户集合有点特殊,不建议在其中添加其他数据,因为当用户获得新的登录令牌时会重新写入。因此,将这些数据提取到另一个集合中可能是一个好主意,特别是如果您希望在写入记录时给它们加上时间戳。