【问题标题】:How to select only first and last element from an array without aggregate?如何从没有聚合的数组中只选择第一个和最后一个元素?
【发布时间】:2021-12-17 10:24:42
【问题描述】:

我想只检索文档中数组的第一个和最后一个元素,方法是使用“find”函数,而不使用“aggregate”。

Here is a Mongo Playground Link

考虑一个文档

{
    _id:"1",
    messages:[
        {
            "text":"First item",
        },
        {
            "text":"Middle item",
        },
        {
            "text":"Last item",
        },
    ],
}

到目前为止,我只能检索第一个或最后一个,例如,要获取最后一个项目,我正在做:

messages: {
    $slice: ["$messages", -1], //Get the last element
},

如何同时获取第一个(第 0 个索引)和最后一个(第 n 个索引)?

注意:我事先没有关于数组长度的任何信息。

注2:我不喜欢使用“聚合”的原因是因为有更多的过滤器、选择、限制和其他各种查询属性正在通过猫鼬的find()、limit()等函数处理,我以通用方式使用它来定义我的包装器。

【问题讨论】:

  • 我想不出没有聚合的方法...您的其他过滤器是什么?也许您可以将它们全部迁移到聚合中。

标签: mongodb mongoose mongodb-query


【解决方案1】:

如果您想要这两个值,请使用如下投影列出它们:

{
  messages: [
    {$slice: ["$messages", 1]},
    {$slice: ["$messages",-1],}
  ],
}

【讨论】:

  • 完美,这正是我所需要的。
【解决方案2】:

使用聚合,您可以像这样使用$first$last

db.collection.aggregate([
  {
    "$project": {
      "first": {
        "$first": "$messages"
      },
      "last": {
        "$last": "$messages"
      }
    }
  }
])

例如here

【讨论】:

  • 谢谢。是否可以通过正常的查找方法来做到这一点?我正在使用各种其他过滤器、选择等。在这种情况下,如果我可以修改“选择”区域的一部分,就像我在示例游乐场中所做的那样,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 2017-01-20
  • 2016-07-24
  • 2017-11-28
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2015-03-09
相关资源
最近更新 更多