Javascript 从要检查值的对象数组中获取最后一个匹配键

Javascript 从要检查值的对象数组中获取最后一个匹配键,javascript,arrays,mongodb,mongodb-query,Javascript,Arrays,Mongodb,Mongodb Query,我的数据看起来是这样的: [ { _id:1 events: [ {selectedPet: 'cat', time: '2015-09-18T12:00:00.000Z'}, {selectedPet: 'dog', time: '2015-09-18T12:00:01.000Z'}, {colourHat: 'green', time: '2015-09-18T12:00:01.200Z'}, {selectedPet: 'bird', time: '201

我的数据看起来是这样的:

[
 {
  _id:1
  events: [
   {selectedPet: 'cat', time: '2015-09-18T12:00:00.000Z'},
   {selectedPet: 'dog', time: '2015-09-18T12:00:01.000Z'},
   {colourHat: 'green', time: '2015-09-18T12:00:01.200Z'},
   {selectedPet: 'bird', time: '2015-09-18T12:00:02.000Z'},
  ]
 },
 {
  _id:2
  events: [
   {selectedPet: 'bird', time: '2015-09-18T12:00:00.000Z'},
   {selectedPet: 'cat', time: '2015-09-18T12:00:01.000Z'},
   {selectedPet: 'dog', time: '2015-09-18T12:00:02.000Z'},
   {favouriteAnimal: 'bird', time: '2015-09-18T12:00:04.000Z'},
  ]
 }
]
我如何查询最后一只选定的宠物(阵列中的最后一只,或按时间排列的最后一只)是鸟

做:

db.getCollection('events').find({
   'events.selectedPet': 'bird'
});
将返回两个文档,但用于选择最后一个选定宠物是鸟的文档的预期输出为:

[
 {
  _id:1
  events: [
   {selectedPet: 'cat', time: '2015-09-18T12:00:00.000Z'},
   {selectedPet: 'dog', time: '2015-09-18T12:00:01.000Z'},
   {colourHat: 'green', time: '2015-09-18T12:00:01.200Z'},
   {selectedPet: 'bird', time: '2015-09-18T12:00:02.000Z'},
  ]
 }
]
这是示例数据。我真正的数据集是数十万个文档,每个文档包含大约500个事件

谢谢=)

您可以使用操作符。但请记住,它会进行JavaScript评估和测试

从即将发布的版本中,您可以使用聚合和
$slice
操作符

db.collection.aggregate([
    { 
        "$project": {
            "e": { "$slice": [
                { "$setDifference": [ 
                    { "$map": { 
                        "input": "$events", 
                        "as": "ev", 
                        "in": { "$ifNull": ["$$ev.selectedPet", false]}
                    }}, 
                    [false]]
                }, 
               -1
            ]}, 
            "events": 1
     }}, 
     { "$match": { "e": "bird" } }
])
你可以用接线员。但请记住,它会进行JavaScript评估和测试

从即将发布的版本中,您可以使用聚合和
$slice
操作符

db.collection.aggregate([
    { 
        "$project": {
            "e": { "$slice": [
                { "$setDifference": [ 
                    { "$map": { 
                        "input": "$events", 
                        "as": "ev", 
                        "in": { "$ifNull": ["$$ev.selectedPet", false]}
                    }}, 
                    [false]]
                }, 
               -1
            ]}, 
            "events": 1
     }}, 
     { "$match": { "e": "bird" } }
])

我不确定预期的结果是什么。请使用显示预期结果。我不确定预期结果是什么。请使用显示预期结果。没有索引将非常糟糕。“看起来像是用你的方法,如果我要问‘狗’,它不会返回文件2号,即使文件2最后选择的宠物是狗。”Drew编辑了我的答案。但是你需要在这里使用
$where
。没有索引会很糟糕。“看起来像是用你的方法,如果我要问‘狗’,它不会返回文件2号,即使文件2最后选择的宠物是狗。”Drew编辑了我的答案。但是您需要在此处使用
$where