javascript - 从对象数组中获取最后一个匹配的键来检查值

标签 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: '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 个事件。

谢谢=)

最佳答案

那么你可以使用$where运算符(operator)。但请记住,它会执行 JavaScript 评估并且 cannot take advantage of indexes .

db.collection.find({ "$where": function() { 
    for (var i = this.events.length - 1; i >= 0; i--) { 
        if (this.events[i]["selectedPet"]) { 
            return this.events[i]["selectedPet"] === "bird"; 
        }
    }}
})

从即将发布的版本中,您可以使用聚合和 $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 - 从对象数组中获取最后一个匹配的键来检查值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651664/

相关文章:

javascript - 在 Typescript 中扩展内置类型

php - 如何解析 onemap.sg API 响应?

python - 将空列表附加到 numpy 数组会更改其 dtype

c++ - c++中表达式必须有常量值错误

node.js - 如何根据填充中的多个条件过滤 Mongoose 中的结果?

javascript - 如何制作图像链接询问用户是否要下载它,而不是将其显示在浏览器中

javascript - For循环和提示

javascript - 使用 Javascript 在 Illustrator 中保存文件

mongodb - 如何使用 MongoRepository 更新 mongodb 中的几个字段?

node.js - 如何从 node.js 干净地关闭 mongodb?