【问题标题】:Mongodb Retrieve first element that match condition in arrayMongodb检索数组中匹配条件的第一个元素
【发布时间】:2021-12-28 22:11:31
【问题描述】:

在发布这个问题之前我已经尝试过阅读,但无法弄清楚。

我试图从我的数据库中的查询中仅返回与给定条件匹配的第一个元素。

集合文件是这样的:

{
    "key": 1,
    timestamps: {
      history: [
        {
          time: 10
        },
        {
          time: 9
        },
        {
          time: 8
        },
        
      ]
    }
  },

例如,我想检索history 数组中timestamp 低于10 的第一个元素。

所以预期的结果应该是这样的:

[
  {
    "timestamps": {
      "history": [
        {
          "time": 9
        }
      ]
    }
  }
]

你可以在这个操场上找到一个例子https://mongoplayground.net/p/jHKb9o-0tHm

到目前为止,我能够检索到数组中低于10 的所有元素,但不仅是第一个匹配项,我该如何实现呢?

此外,由于我试图使其尽可能高效,因此仅检索数据库的第一个元素是否更快,或者它只是对数据库执行的附加操作,因为仅返回第一个元素的操作是在那之后数据库已经找到所有元素了吗?

【问题讨论】:

标签: mongodb nosql aggregate


【解决方案1】:

数组字段"timestamps.history" 是一个嵌套字段,使用$elemMatch 投影运算符获取第一个匹配元素失败并出现错误:"Cannot use $elemMatch projection on a nested field."

在这种情况下,使用如下所示的Positional Projection Operator $ 来获得所需的结果。

db.collection.find(
 {
   key: 1, "timestamps.history.time": { $lt: 10 }
 },
 {
   "timestamps.history.$": 1
 }
)

【讨论】:

  • 谢谢你的作品,你还知道如何在投影之前对元素进行排序吗?我的意思是在这个沙箱mongoplayground.net/p/lIaBXRSGSTN 中,我希望查询以time: 9 而不是time: 8 返回历史记录。或者也许得到最后一个元素而不是第一个元素,我试图将索引-1 放在投影中但不起作用
  • 投影选择第一个匹配的元素。您可以使用聚合查询进行更具体的匹配或投影。
猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多