mongodb找到嵌套对象

时间:2013-05-26 08:09:59

标签: mongodb meteor

我有很多文件,结构如下:

{
    _id: ObjectId("519af935c1a9f8094f0002aa"),
    messages: [{
          message: "Message A",
          timestamp: 1369130219638
      },
      {
          message: "Message B",
          timestamp: 1369130249638
      },
      {
          message: "Message C",
          timestamp: 1369130291638
      }
    ]
}

...我不知道如何查询超过1小时前发布最后一条消息的所有文档。例如:get all documents where timestamp < now() - 3600其中now()是当前时间戳。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

文档查询

mongodb查询将返回包含带时间戳的消息的文档。你可以做到

var tofilter = Messages.find({"messages.timestamp":{$lt:new Date().getTime()-3600*1000}});

现在你必须摆脱每个文件中与日期/时间查询不匹配的所有消息:

上述查询将返回符合条件的所有文档,但只要其中一条符合条件,它们就会包含每条文件中的所有邮件,无论它们具有什么时间戳。

过滤消息

var results = tofilter.map(function(doc) {
                var messages = doc.messages;
                return _.filter(messages, function(message) {
                    return (message.timestamp < new Date().getTime()-3600*1000)
                });
            });

所以现在results将包含所有mongodb文档,仅包含与日期/时间查询匹配的邮件

* 注意 new Date.getTime()以js格式返回时间戳,以毫秒为单位,因此需要将3600乘以1000以获得1小时的毫秒数。