【问题标题】:Unwind array and return the last element matching condition展开数组并返回最后一个元素匹配条件
【发布时间】:2015-05-14 15:28:20
【问题描述】:

假设我有一个看起来像这样的文档结构

[
    { 
        _id:1,
        Logs : [
            { time: 123, x: 24 },
            { time: 212, x: 13 },
            { time: 325, x: 34 }
        ]
    },
    { 
        _id:2,
        Logs : [
            { time: 63, x: 19 },
            { time: 112, x: 25 },
            { time: 205, x: 15 }
        ]
    }
]

我想要得到的是x 的值,其中time

例如,如果 y=2,n=115,我希望返回 25。

鉴于time

我将在 C# 中进行此操作,但如果有人可以提供帮助,我可以从 shell 语法转换吗?

谢谢

编辑:

所以我要问的问题是...... $elemmatch 只会在找到一个匹配项时返回文档,因此 $elemmatch on time

因此我假设我需要使用聚合来过滤投影数组?

【问题讨论】:

  • 那么您遇到了什么问题?你现在在做什么,为什么不工作?
  • 现在更有意义了吗?
  • 那么,您所使用的代码存在您所描述的问题的原因是什么?
  • @Servy 这是一个基于我发布的示例的问题。如果对你来说不够清楚 - 对不起

标签: c# mongodb


【解决方案1】:

以下聚合将为您提供所需的结果:

db.collection.aggregate([
   {
     "$match": {"_id": y, "Logs.time": {"$lt": n} }
   },
   {
     "$unwind": "$Logs"
   }, 
   {
     "$match": {"Logs.time": {"$lt": n} }
   },
   {
     "$group": {
         "_id": "$_id",
         "x": { "$max": "$Logs.x"  }
     }
   },
   {
     "$project": {
         "_id": 0,
         "x": 1
     }
   }
])

【讨论】:

  • 太棒了,这正是我所需要的。我做了一些改变,以按预测结果排序并限制为 1。我现在遇到了 c# v2 驱动程序的问题,我将单独发布
  • @sambomartin 不错,我几乎没有想到 $sort$limit 选项:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多