【问题标题】:MongoDB Embedded object creation in Java without morphia.MongoDB 在没有 morphia 的 Java 中嵌入对象创建。
【发布时间】:2011-07-29 09:16:43
【问题描述】:

我对 mongodb 非常陌生,并尝试将其用于开发。 我有一个概念模型:
用户={"uid":"", "服务":"[
{
"serviceid":"sid",<br>"sub_dat":"somedate",
"exp_date":"somedate",<br>},
{
"serviceid":"sid",<br>"sub_dat":"somedate",
"exp_date":"somedate",<br>},
{ "serviceid":"sid",<br>"sub_dat":"somedate",
"exp_date":"somedate",<br>},
]",
“朋友”:“[
{
"friend_id":"",
"friendname":"name"
"friendshipyrs":"yrs",
},

{
"friend_id":"",
"friendname":"name"
"friendshipyrs":"yrs"
},

]", }

我想知道在 java 中使用原始驱动程序而不是 morphia 的步骤: 1.创建这个对象,这样我就有能力: 2. 获取新服务和好友并将其添加到服务列表中。

我目前可以添加到顶层,我尝试使用 BasicDBObject、DBList 甚至 ObjectBUilder,但无法弄清楚如何使用 java 驱动程序添加或推入字段以创建数组/列表从 10gen 网站上的演示文稿中可以看出。

另外,希望能够通过单个查询深入说..朋友信息,那么是否建议维护上述结构或将朋友创建为一个类并将类对象放入列表中?我知道点运算符,但我不知道如何通过 java 驱动程序访问类字段。

将非常感谢任何帮助... 谢谢

【问题讨论】:

    标签: java mongodb mongodb-java


    【解决方案1】:

    首先,每个帖子问一个问题更容易;)

    使用 java 驱动程序进行更新非常简单,虽然有点冗长:

    假设你的 mongo 更新看起来像:

    db.users.friends({_id: <someuserid>}, {$push:{friends:{friend_id:...., friendname: ....}}})
    

    您在 Java 中所要做的就是创建一个封装该更新的 DBObject,所以在这种情况下:

    DBObject query = new BasicDBObject("_id", <someuserid>);
    
    DBObject newFriend = new BasicDBObject("friend_id", ...);
    newFriend.put("friendname", ....);
    
    DBObject update = new BasicDBObject("$push", new BasicDBObject("friends", newFriend));
    
    DBCollection col = db.getCollection("users");
    
    col.update(query, update);
    

    请原谅任何拼写错误,我实际上并没有检查过这个或其他任何东西的语法,但它应该能让你开始。值得注意的是,在用 Java 尝试之前,能够在 shell 中完成这些事情很重要。该 API 还具有 QueryBuilder,可简化查询对象的构建。

    完整的 API 文档可以在这里找到:http://api.mongodb.org/java/2.6.3/

    【讨论】:

    • 作为一个小 P.S.,使用某种 ORM 库而不是直接使用 Java 驱动程序几乎总是一个好主意,因为它使代码难以阅读并且过于冗长。你有什么理由积极避免 Morphia 之类的吗?
    • 非常感谢 Remon,刚刚注意到响应...将尝试并让您知道。我真的很感激。
    • 我猜我应该创建服务和朋友作为类对象和 $push 实例然后用点运算符检索字段......我正在避免 morphia(现在)因为我想首先了解引擎盖下的内容。我还读到通过 morphia 管理嵌入式对象有点挑战。我猜这让我感到害怕,因为我希望数据具有尽可能多的灵活性。哦,下次我会很好地在每个帖子中问 1 个问题 :-)
    • 好吧,我们编写了自己的 ORM 来更好地满足我们的需求,但重点是存在的。基本的 Java 驱动程序代码非常冗长,很容易引入错误。请注意,如果您对 shell 语法更熟悉,您可以使用 DBObject query = JSON.parse("{\"friend._id\": ObjectId("982173981273891739812")}");反而。让我们以牺牲验证和一些性能为代价编写类似 shell 的查询。
    【解决方案2】:

    就像 Remon 所说的那样,我认为使用 ORM 是一个好主意,因为它通常提供比自己滚动更适合生产的方法。听起来你想对我使用对象引用。通过使用@Reference 注释,我可以将对象“嵌入”到另一个对象中,然后一旦我加载了拥有的对象,我就可以访问拥有的对象(我认为这使用了急切加载)。一个例子:

    @Entity public class PlaylistItem extends SomeModel{
       @Required
       @Reference
       public Playlist playlist;
    
       @Required
       @Reference
       public Track track;
    }
    

    Playlist 和 Track 是用 @Entity 注释的两个模型,就像这个 PlaylistItem 对象一样。

    希望这会有所帮助。

    在此处了解有关 Morphia 注释的更多信息:http://code.google.com/p/morphia/wiki/AllAnnotations。甚至还有一个 Embeddd 注释,但我从来没有使用过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2015-08-13
      • 2016-04-17
      • 2012-06-30
      相关资源
      最近更新 更多