Javascript 对数组内嵌套对象的mongodb distinct操作
我的mongodb数据库如下所示Javascript 对数组内嵌套对象的mongodb distinct操作,javascript,mongodb,Javascript,Mongodb,我的mongodb数据库如下所示 [{ "_id": ObjectId("5e049ebc8e935c407f78c190"), "2020-04-25": [ { "browser": "Chrome", "ts": "2020-04-25 21:05" }, { "browser": "Firefox", "ts": "2020-04-25 21:05" }
[{
"_id": ObjectId("5e049ebc8e935c407f78c190"),
"2020-04-25": [
{
"browser": "Chrome",
"ts": "2020-04-25 21:05"
},
{
"browser": "Firefox",
"ts": "2020-04-25 21:05"
}
]
},
{
"_id": ObjectId("5e049ebc8e935c407f68c190"),
"2020-04-26": [
{
"browser": "Chrome",
"ts": "2020-04-26 10:45"
},
{
"browser": "Edge",
"ts": "2020-04-26 10:45"
},
{
"browser": "Firefox",
"ts": "2020-04-26 10:46"
}
]
}]
我想查找键浏览器的所有不同值
我尝试过使用distinct,但我一直在想如何在db中的所有日期都使用它
我尝试了$all运算符,但发现它只能用于值,不能用于键。对于当前的数据结构,无法避免在所有数据上使用,然后进行分组。这将使这条管道非常低效
db.collection.aggregate([
{
"$addFields": {
"newField": {
"$objectToArray": "$$ROOT"
}
}
},
{
"$unwind": "$newField"
},
{
"$unwind": "$newField.v"
},
{
"$group": {
"_id": "$newField.v.browser"
}
},
{
"$match": {
// this null is due to the _id field, you could also filter "newField" before unwinding instead.
"_id": {"$ne": null}
}
}
]);
我建议你考虑重新构造你的数据,比如:
{
"_id": ObjectId("5e049ebc8e935c407f68c190"),
date: "2020-04-26",
data: [
{
"browser": "Chrome",
"ts": "2020-04-26 10:45"
},
{
"browser": "Edge",
"ts": "2020-04-26 10:45"
},
{
"browser": "Firefox",
"ts": "2020-04-26 10:46"
}
]
}
现在,您可以轻松地实现相同的结果(以及许多其他结果),如下所示:
db.collection.distinct("data.browser")