展开数组并返回最后一个元素匹配条件

时间:2015-05-14 15:28:21

标签: c# mongodb

假设我的文档结构类似于

[
    { 
        _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< time的价值n和_id = y

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

鉴于<img id="<?php echo $id; ?>" src="img/.." url=".." name="..." onClick="changeImage(this)"/> function changeImage(item) { var url_img = $(item).attr('url'); var name_item = $(item).attr('name'); var item_id = $(item).attr('id'); document.getElementById('test').innerHTML += '<div style=\'display:inline-block\'><img src=' + url_img + ' url = ' + url_img + ' onClick=document.getElementById(' + item_id + ').classname=\'\'; /> ' + name_item + '</div>'; $(item).toggleClass('hideitem'); } &lt; 115和匹配数组中过滤器的最长时间?

我在C#中使用它,但如果有人可以提供帮助,可以从shell语法转换吗?

感谢

编辑:

所以我问的问题是...... $ elemmatch只会在找到一个匹配项时返回文档,因此$ elemmatch on time&lt; 115和_id = 2将返回第二个文档。如果我投影数组,我将获得所有三个Logs子文档。

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

1 个答案:

答案 0 :(得分: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
     }
   }
])