当前位置: 首页 > 面试题库 >

使用mgo存储嵌套结构

董和风
2023-03-14
问题内容

我正在尝试从高度嵌套的go结构构建mongo文档,并且从go struct过渡到mongo对象遇到了问题。我已经在这里构建了一个 非常
简化的版本:http :
//play.golang.org/p/yPZW88deOa

package main

import (
    "os"
    "fmt"
    "encoding/json"
)

type Square struct {
    Length int 
    Width int
}

type Cube struct {
    Square
    Depth int
}

func main() {
    c := new(Cube)
    c.Length = 2
    c.Width = 3
    c.Depth = 4

    b, err := json.Marshal(c)
    if err != nil {
        panic(err)
    }

    fmt.Println(c)
    os.Stdout.Write(b)
}

运行此命令将产生以下输出:

&{{2 3} 4}
{"Length":2,"Width":3,"Depth":4}

完全有道理。似乎Write函数或json.Marshal函数都具有折叠嵌套结构的某些功能,但是当我尝试使用mgo函数将此数据插入到mongo数据库中时,我的问题来了func (*Collection) Upsert(http://godoc.org/labix .org / v2 /
mgo#Collection.Upsert)。如果我先使用该json.Marshal()函数并将字节传递给collection.Upsert(),则它会以二进制形式存储,这是我不想要的,但是如果使用collection.Upsert(bson.M("_id": id, &c)它,它会以嵌套结构的形式出现:

{
    "Square": {
        "Length": 2
        "Width": 3
    }
    "Depth": 4
}

但是我想要做的是使用与使用os.Stdout.Write()函数时相同的结构来向mongo上插入:

{
     "Length":2,
     "Width":3,
     "Depth":4
}

我是否缺少一些可以轻松解决此问题的标志?在这一点上,我能看到的唯一选择是通过删除结构的嵌套来严重降低代码的可读性,而我真的很讨厌这样做。同样,我的实际代码比本示例要复杂得多,因此,如果我可以避免通过嵌套嵌套而使其更加复杂,那绝对是更好的选择。


问题答案:

我认为使用inline字段标记是您的最佳选择。该氧化镁/ V2 /
BSON文档
状态:

inline     Inline the field, which must be a struct or a map,
           causing all of its fields or keys to be processed as if
           they were part of the outer struct. For maps, keys must
           not conflict with the bson keys of other struct fields.

然后,您的结构应定义如下:

type Cube struct {
    Square `bson:",inline"`
    Depth  int
}

编辑

inline``mgo/v1/bson如果您正在使用那个,也存在。



 类似资料:
  • 我正在尝试使用Cassandra中的复合表和nodejs绑定来存储嵌套的JSON对象。 假设我的数据看起来像这样(朋友和敌人实际上拥有比简单地图更复杂的数据结构): 根据我对复合键的理解(这里:https://pkghosh.wordpress.com/2013/07/14/storing-nested-objects-in-cassandra-composite_columns/),我希望像这样

  • 问题内容: 我试图弄清楚如何使用Go使用嵌套结构与GAE数据存储区一起使用。我知道数据存储区不专门支持嵌套结构。我需要找到一种简单的方法,使用户信息以JSON的形式发送给用户时,将其与帖子一起发送。 我想到的一件事是为用户放置两个字段。一个用于引用用户的ID /密钥,另一个用于用户类型struct,当从数据存储区加载帖子时,该结构将添加到其中。多余的字段似乎很愚蠢,所以我希望对此有更好的解决方案。

  • 问题内容: 是否可以在另一个存储过程中使用一个存储过程的结果? IE 我尝试使用,但无法在嵌套语句中调用。 有什么办法可以做到这一点?环境是SQL Server 2008。 问题答案: 您最多可以嵌套32个级别的存储过程。 我建议阅读这篇有关INSERT- EXEC的文章。这是一个摘录: 如果some_sp尝试使用INSERT-EXEC调用some_other_sp,您将收到一条错误消息。因此,一

  • 在谷歌云存储中,我在名为图像的根桶中有一个名为猫的桶。我正在使用google-api-ruby-Client gem上传文件。我可以将文件上传到根桶“图像”,但上传到“图像/猫”不起作用。我知道谷歌云存储中的存储桶没有斜杠的概念,所以我无法弄清楚如何指定嵌套存储桶的名称。 这给出了nil:NilClass的错误

  • 好吧,我一直在Kotlin试验原始数据存储,我有一个问题。我正在使用以下内容。原型文件: 这是我的序列化程序类: 和我的存储库: 因此,在我的updateValue()方法中,我可以设置“name”字段的名称,但我没有地址消息字段的setter,如street和number。编译器只显示getter。在姓名和年龄字段的另一边,我有setters。如何对这两个地址字段使用setters:街道、编号?

  • 从另一个角度看这3行: 编辑:注意表有2000列,是否可以动态创建一个类(或向类添加属性),例如在Scala中从外部文件加载字段名和类型?我知道case类仅限于22个字段 Edit2:还要注意,任何属性都可以有多行(rowkey除外),即orderid、name、amount、supplier、account和1995+其他列,所以为所有这些属性创建单独的“singleline”类是不可行的,我正