有没有办法扩展存储在数据库中的对象?
示例:
说我有一个对象:
XCTestCase
第二个对象扩展第一个
{
id: 1
extends: null
type: HondaAccord
doors: 4
engine: 2 liter
dealerId: null
price: 20000
}
第三个Object结束第二个:
{
id: 2
extends: 1
dealerId: 2
price: 25000
key1: value1
key2: value2
}
我希望能够查询第二个对象并返回:
{
id: 3
extends: 2
dealerId: 3
price: 27000
key1: some extended value
}
我希望能够查询第三个对象并返回:
{
id: 2
extends: 1
type: HondaAccord
doors: 4
engine: 2 liter
dealerId: 2
price: 25000
key1: value1
key2: value2
}
在关系数据库中,我可以对这些数据进行规范化并执行一些复杂的左连接等来获取此数据。
在NoSQL数据库中有更简单的方法吗?我的应用程序要求我能够查询这些对象并获取文字表示以及展开(如预期结果中所示)表示。
目前,我在Java代码中这样做。即:获取一个对象,看看是否应该扩展另一个对象,获取该对象并通过它进行递归。如果我需要能够抓住很多"扩展"对象,存在重大的性能问题。
任何模式都可以创建这样的东西? SQL还是NoSQL?看起来几乎像装饰者模式,但对于数据。
答案 0 :(得分:1)
$graphlookup
操作以递归方式匹配集合中的“extends”和“id”属性,并返回每个查询文档的层次结构。
应用$sort
,因为查找的数据无法保证维持顺序,因此我们可以有序地解析重复的密钥。
使用当前(3.4)prod版本。
在$arrayToObject
$objectToArray
和$reduce
中使用$concatArrays
和$replaceRoot
来合并文档。
i
生成具有键值对的数组,用于当前(SOFTWARE (64-Bit)/Microsoft/Office/Outlook
)和$objectToArray
以连接所有键值对以生成键值对的数组,后跟{{1生成合并文档和mergeObjects
以升级为顶级文档。
$$this
通过“id”$$value
和“extend”$arrayToObject
来优先选择查询文档中的字段而不是其他查找文档。
$sort
您可以在当前开发版本3.5.13开发版本中使用How can you determine how much disk space a particular MySQL table is taking up?聚合运算符,该版本将在即将发布的3.6版本中使用。
desc
通过“id”desc
和“extend”db.collection.aggregate([
{
"$match": {
"id": 3
}
},
{
"$graphLookup": {
"from": collection,
"startWith": "$id",
"connectFromField": "extends",
"connectToField": "id",
"as": "hierarchy"
}
},
{
"$unwind": "$hierarchy"
},
{
"$sort": {
"id": -1,
"hierarchy.extends": 1
}
},
{
"$group": {
"_id": "$id",
"hierarchy": {
"$push": "$hierarchy"
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$reduce": {
"input": "$hierarchy",
"initialValue": [],
"in": {
"$concatArrays": [
{
"$objectToArray": "$$this"
},
"$$value"
]
}
}
}
}
}
}
])
来优先选择查询文档中的字段而不是其他查找文档。
$sort