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
。