gpt4 book ai didi

mongodb - 如何查询一个动态键——mongodb schema设计

转载 作者:行者123 更新时间:2023-12-05 08:58:51 29 4
gpt4 key购买 nike

我有以下文件:

{
_id : 1,

key1 : {
samekeyA : "value1",
samekeyB : "value2"
},

key2 : {
samekeyA : "value3",
samekeyB : "value4"
},

key3 : {
samekeyA : "value5",
samekeyB : "value6"
}
}

以上; key1, key2key3 是为了证明我不知道完整的 key ,除了它的前缀;但内键 samekeyAsamekeyB 是我知道的。我需要这样的查询:db.coll.find({"key*.samekeyA":"value1"})

我认为没有一种 mongo 方式 - 正则表达式键查询? - 来完成它,那么对此有什么想法吗?我应该改造我的文档 -tree- 吗?

最佳答案

使用 MongoDB 3.4.4 及更新版本:

db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])

上面的管道将产生最终的输出

{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}

说明

可以分解管道以显示每个单独的运算符的结果。

$objectToArray

$objectToArray 使您能够使用动态键转换根文档(由系统变量 $$ROOT 表示)到一个数组中,该数组包含原始文档中每个字段/值对的元素。返回数组中的每个元素都是一个包含两个字段 k 和 v 的文档。在 $project 中仅与运算符(operator)一起运行管道阶段

db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])

产量

{
"_id" : 1,
"keys" : [
{
"k" : "_id",
"v" : 1
},
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
},
{
"k" : "key2",
"v" : {
"samekeyA" : "value3",
"samekeyB" : "value4"
}
},
{
"k" : "key3",
"v" : {
"samekeyA" : "value5",
"samekeyB" : "value6"
}
}
]
}

$filter

$filter 运算符充当由 $objectToArray 生成的数组的过滤机制。 运算符,通过选择数组的一个子集来根据指定的条件返回成为您的查询。

考虑以下管道,它返回与条件匹配的键/值对数组 { "samekeyA": "value1"}

db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])

产生

{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}

$arrayToObject

这将从上面的过滤数组转换

[ 
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]

使用动态 key 到原始文档

{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}

所以运行管道

db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])

会产生

{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}

$replaceRoot

这会将过滤后的动态关键文档提升到顶层并替换所有其他字段。该操作会替换输入文档中的所有现有字段,包括 _id 字段。

本质上,这转换了上面的文档

{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}

到期望的最终输出

{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}

关于mongodb - 如何查询一个动态键——mongodb schema设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082606/

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