如何检查mongoDB记录是否少于一天?

时间:2015-05-29 12:29:53

标签: mongodb meteor

我正在尝试在我的流星应用程序中实现用户“组”系统。以下是组文档mongodb结构的简化示例:

{
    "_id": "w74grb7GnaoqS4dMJ", //Id of the group
    "name": "My beautiful group",
    "createdAt": ISODate("2015-05-27T12:44:52.288Z"),
    "createdBy": "7tKqK3bm72MK47ngH",
    "users": [
    "7tKqK3bm72MK47ngH" //Meteor user id array
    ],
    "admins": [
    "7tKqK3bm72MK47ngH"
    ],
    "leaving_users": [
    {
    "user_id": "9zXdV6bm72MK47ngH",
    "leaving_date": ISODate("2015-05-27T16:15:23.170Z")
    }],
    "modifiedAt": ISODate("2015-05-27T16:41:57.589Z"),
    "modifiedBy": "FZ78Pr82JPz66Gc3p"
}

我想获得以下行为:

  • 当用户离开某个组时,他的ID将从“users”数组中删除。
  • 由于我希望他能够在接下来的24小时内重新加入该组而不请求组管理员进行验证,我还会创建一个包含2个字符串字段的“leaving_users”对象数组:userId和日期左侧。
  • 如果用户尝试在24小时限制内再次加入最近离开的组,我想检查他是否属于leaving_users数组,以及他的记录是否少于24小时。

我遇到问题的部分是发送回布尔标志的服务器方法,意思是“让用户在过去的24小时内离开”。我想这与我的mongo请求有关,但我无法弄清楚出了什么问题。

这是我的方法代码:

Meteor.methods({
    GroupRecentlyQuitted: function(groupId) {
    //groups left by current user in the past 24h
    if (Users.isInRoles(Meteor.userId(), ["user"])) {
        var yesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));
        return Groups.find({
            _id: groupId,
            "leaving_users.user_id": Meteor.userId(),
            "leaving_users.leaving_date": {
                $gte: yesterday
            }
        });
    }
    }
});

我称之为方法的客户端代码:

var RecentlyQuitted = false
Meteor.call("GroupRecentlyQuitted", me._id, function(error, result) {
    if (error) {
    console.log("error", error);
    }
    if (result) {
    RecentlyQuitted = true
    console.log(result);
    }
});

此版本会抛出RangeError: Maximum call stack size exceeded。我不知道为什么我也不知道如何从我的服务器方法执行获得更好的反馈(错误发生在方法中的Group.find查询期间)。

编辑:当我直接输入时,查询在robomongo中正常工作。

1 个答案:

答案 0 :(得分:0)

好的,我设法使用@richsilv中的answer解决了这个问题(如果你读了我,谢谢老兄)。事实证明,您不能指望来自服务器的游标方法(仅限EJSON),只有发布提供游标。三天来想出来......: - )

总结一下,你不能在方法(即光标)中返回Collection.find()。您需要使用Collection.findOne()或使用Collection.find().fetch()

的文档数组返回文档