【问题标题】:I want a specific document and only the latest item in a subdocument (Mongodb / Node.js)我想要一个特定的文档,并且只有子文档中的最新项目(Mongodb / Node.js)
【发布时间】:2015-10-30 12:36:24
【问题描述】:

我有一个这样的模型:

User:
{
  name: "test",
  phone: "1234567890",
  password: "test",
  email: "test@tester.com",
  tasks: {
    { task: "do this", timestamp: "2015-08-01" },
    { task: "then this", timestamp: "2015-08-05" },
    { task: "finally this", timestamp: "2015-08-07" }
  }
},
... (more users) ...

如何获取特定用户的详细信息,例如姓名、电子邮件以及只有 1 个任务是最新的?

User.find({phone: '1234567890', password: 'test'}, '_id name email tasks',   function(err, user) {
        if (err)
            res.json({result: false});
        res.json({result: !(user == null), object: user});
});

这会返回所有任务。

【问题讨论】:

  • “最新的”到底是什么意思?任务是否总是有序的?你能忍受让它们总是有序的吗?如果是这样,那靠什么?时间戳?这对您的答案有所不同。 “时间戳”也是一个字符串,它可能应该是一个日期对象。
  • 最新的是时间戳最新的任务,它将是一个日期对象。
  • 好吧,我问的还有 “他们总是订购吗?” 如果不是,那么您选择了错误的答案(不是另一个合适)。这取决于“最后一个”数组项是否始终是您想要的。好像它们并不总是按日期顺序排列,这会有所不同。这就是我问的原因。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

你可以使用$slice (projection)

User.find({
  phone: '1234567890',
  password: 'test'
}, {
    name: 1,
    email: 1,
    tasks: {$slice: -1}
}, function (err, user) {
   if (err) {
      res.json({result: false});
      return;
   }

    return res.json({result: !(user == null), object: user});
});

注意tasks 应该是Array 而不是Object

【讨论】:

    【解决方案2】:

    如果您通过数组的 push 方法插入新任务。然后您可以通过获取任务数组的长度来获取最后一条记录,并按长度访问最后一条记录 - 1。

    或者你可以参考这个: return document with latest subdocument only in mongodb aggregate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2015-01-26
      • 1970-01-01
      相关资源
      最近更新 更多