gpt4 book ai didi

javascript - 在不列出所有键的情况下将子字段提升到投影的顶层

转载 作者:可可西里 更新时间:2023-11-01 10:02:31 24 4
gpt4 key购买 nike

我有像 {'a': 1, 'z': {'b': 2, 'c': 3,}} 这样的文档。

我想要 {'a': 1, 'b': 2, 'c': 3}

我可以用

aggregate({'$project': {'b': '$z.b', 'c': '$z.c'}})

是否可以在不手动列出子文档中的所有键的情况下执行此操作?

最佳答案

在 MongoDB 3.4 中,您可以将 $objectToArray$arrayToObject$replaceRoot 一起使用,以更改此设置:

db.wish.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$concatArrays": [
[{ "k": "a", "v": "$a" }],
{ "$objectToArray": "$z" }
]
}
}
}}
])

甚至连“a”属性都没有指定的这么长的咒语:

db.wish.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$reduce": {
"input": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "r",
"cond": { "$ne": [ "$$r.k", "_id" ] }
}
},
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
{ "$cond": {
"if": { "$gt": [ "$$this.v", {} ] },
"then": { "$objectToArray": "$$this.v" },
"else": ["$$this"]
}}
]
}
}
}
}
}}
])

两者都产生:

{ "a" : 1, "b" : 2, "c" : 3 }

$concatArrays 的有趣用法在未来的版本中应该没有必要,因为会有一个 $mergeObjects 运算符,这将使它更清晰一些。

但是您基本上可以非常简单地在客户端代码中做同样的事情。例如在用于 shell 的 JavaScript 中:

db.wish.find().map( doc => (
Object.assign({ a: doc.a }, doc.z )
))

或者再次没有"a"的版本:

db.wish.find().map( doc => 
Object.keys(doc).filter(k => k !== '_id').map(k =>
( typeof(doc[k]) === "object" ) ?
Object.keys(doc[k]).map(i => ({ [i]: doc[k][i] }))
.reduce((acc, curr) => Object.assign(acc,curr),{})
: { [k]: doc[k] }
).reduce((acc,curr) => Object.assign(acc,curr),{})
)

产生相同的输出

{ "a" : 1, "b" : 2, "c" : 3 }

关于javascript - 在不列出所有键的情况下将子字段提升到投影的顶层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44752934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com