MongoDB中递归文档的结构和查询语法?

MongoDB中递归文档的结构和查询语法?,mongodb,recursion,pymongo,database,Mongodb,Recursion,Pymongo,Database,我最近开始调查MongoDB的一个工作项目。我对JSON和MongoDB的查询结构还比较陌生,所以我希望你们中的一位能够提供一些澄清 我已经将这个问题翻译成Excel术语,因为它很常见,并且很好地代表了我的问题 如果我试图将Excel公式建模到MongoDB文档中,那么最好的格式是什么(我将在下面解释我的潜在查询)?请记住,Excel中的公式可以(几乎)以任何顺序和深度嵌套,参数可以是字符串或数字形式。我希望能够在这些单元格中进行搜索,以回答诸如“查找使用=AVG()函数的所有单元格”或“查找在

我最近开始调查MongoDB的一个工作项目。我对JSON和MongoDB的查询结构还比较陌生,所以我希望你们中的一位能够提供一些澄清

我已经将这个问题翻译成Excel术语,因为它很常见,并且很好地代表了我的问题

如果我试图将Excel公式建模到MongoDB文档中,那么最好的格式是什么(我将在下面解释我的潜在查询)?请记住,Excel中的公式可以(几乎)以任何顺序和深度嵌套,参数可以是字符串或数字形式。我希望能够在这些单元格中进行搜索,以回答诸如“查找使用=AVG()函数的所有单元格”或“查找在=AVG()函数中包含=SUM()函数的所有单元格(例如=AVG(x,y,z,SUM(a,b,c))。”能够回答这些基于公式结构的查询比在无法全部回答的情况下回答关于数字或字符串的查询更重要

目前,我设想我的文档大致有以下格式:

{
    formula: "AVG",
    arguments: [4,5, {
        formula: "SUM",
        arguments: [6,7,{
            formula: "ABS",
            arguments: [-8,-9]
(closing parenthesis/brackets)
}

这是我想要做的合理的格式吗?如果是,我将如何查询“查找包含=SUM和=AVG的案例”?找到嵌套得更深的=ABS公式怎么样?由于公式的动态性质,不可能期望一定的顺序或深度。

如果您有这样的任意结构,那么我建议您以不同的方式存储树。任意结构很难查询和处理


MongoDB文档提供了一些建议:

继续进行Excel类比:

第一件事是,我决定在第二级和第二级以外的子级上进行查询并不是真正必要的(这使问题变得越来越简单)。这种结构不能很容易地适应这种情况,因此,公平的警告。这不是我原来问题的完美答案,对不起!似乎MongoDB不太适合轻松存储我的原始问题

我使用了一种类似于MongoDB推荐的表示树的结构。不再试图将Excel文档表示为一个MongoDB文档,而是将其表示为多个(每个使用的唯一公式一个,一个用于存储字符串和值)。与同一excel工作簿相关的所有MongoDB文档都有一个字段工作簿,并存储它们所属的工作簿

一个非常简单的示例(定制的
\u id
标记不是必需的,但更易于阅读):

这4个MongoDB文档代表一个具有以下公式结构的Excel文档(这不是生成上述MongoDB文档的唯一Excel表):

除了值1、2、3和字符串“hello”之外,还有其中的“world”

查询“在AVG公式中查找包含SUM公式的书籍”是以下查询:

db.collection.find({$and: [{formula: 'AVG'},{children: 'SUM'}]})

返回
\u id:book1\u 3
MongoDB文档。然后,您可以按照自己的意愿剥离工作簿。

仅供参考,您可以将
=SUM
=AVG
等内容放在backticks(通常与~)的内部,因为这些代码属于内联代码。欢迎来到StackOverflow@我确实读过内联代码,我真的不认为Excel公式足够酷,值得性感代码格式化。如果你认为这有助于其他人理解我的问题,我会改变它。考虑到你想提出的查询的描述,我不一定认为这适合MongoDB。听起来你更想考虑一个允许更复杂的“儿童/祖先”类型搜索的图形数据库。非常好地提出问题,谢谢。这让我在投入太多精力在MongoDB上之前,先离开MongoDB去看看图形数据库。干杯
=SUM(AVG())
=AVG(SUM())
=ABS(SUM(ABS()))
db.collection.find({$and: [{formula: 'AVG'},{children: 'SUM'}]})