如何从mongodb中类型对象的字段中选择集合中的所有现有字段



我有一个集合,它有一个名为"数据";可以具有任何字段,并且我必须获得"中所有集合中的所有现有字段;数据";字段或获取在该"字段"中具有不同字段的文档;数据";领域

例如,如果我有:

[
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "juanito",
city: "cali",
data: {
age: 23,
lastName: "merlano",
cars: 2
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
},
]

我想要什么:

["age", "lastName", "cars", "moto"]

文档中;数据";字段各不相同,与它们的值无关。

[
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
}

]

如果我使用,该系列有太多文件可能会出现问题FINDALL,然后使用类似于循环的FOR(对于资源(

无论你如何执行(在内存或数据库中(,这都是一个非常昂贵的查询,也就是说,我同意在内存中执行这是错误的方法。

以下是如何使用聚合管道和一些标准运算符(如$map$objectToArray:(来实现这一点

db.collection.aggregate([
{
$project: {
keys: {
$map: {
input: {
"$objectToArray": "$data"
},
in: "$$this.k"
}
}
}
},
{
"$unwind": "$keys"
},
{
$group: {
_id: "$keys"
}
}
])

Mongo游乐场

一旦集合中有了所有文档的数组,就可以使用javascript了:

let arr = [
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "juanito",
city: "cali",
data: {
age: 23,
lastName: "merlano",
cars: 2
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
},
]

您可以使用.map方法来获得一个数据对象数组,如下所示:

arr = arr.map(obj => obj.data)

这将返回

[
{
"age": 12,
"lastName": "panguano",
"cars": 0
},
{
"age": 23,
"lastName": "merlano",
"cars": 2
},
{
"lastName": "betito",
"cars": 2
},
{
"age": 28,
"cars": 1,
"moto": 3
}
]

然后,您可以通过循环数据对象数组来获得数据对象键数组,如下所示:

let dataKeys = [];
arr.forEach(obj => {
dataKeys = [...dataKeys, ...Object.keys(obj)]
})

这返回一个非唯一密钥数组:

dataKeys = [
"age",
"lastName",
"cars",
"age",
"lastName",
"cars",
"lastName",
"cars",
"age",
"cars",
"moto"
]

然后使用.filter和.findIndex方法过滤出唯一密钥:

let uniqueKeys = dataKeys.filter((elem, index) => dataKeys.findIndex(obj => obj === elem) === index)

这会给你

[
"age",
"lastName",
"cars",
"moto"
]

最新更新