MongoDB的DBREF 使用.

首先要记一下根据 DBREF 的ObjectId 以及根据 ref 集合为条件查询问题.

在不同的可视化客户端里面显示的问题.

//某客户端显示这样,直接CMD查询也是这样显示.这样我无法看懂find条件
{
"_id" : ObjectId("58ae865f7dde420cd0eae39f"), "className" : "com.thesys.morphia.dbref.DbrefTest$Book", "price" : "60.0", "author" : DBRef("Author", ObjectId("58ae865f7dde420cd0eae39e")) }

换了一个客户端

//同一个数据显示的格式,根据这样尝试查询
{
"_id" : ObjectId("58ae865f7dde420cd0eae39f"), "className" : "com.thesys.morphia.dbref.DbrefTest$Book", "price" : "60.0", "author" : { "$ref" : "Author", "$id" : ObjectId("58ae865f7dde420cd0eae39e") } }

以下两个shell均可查询

db.Book.find({"author.$ref":"Author"})

db.Book.find({"author.$id":ObjectId("58ae865f7dde420cd0eae39e")})

以下是我的测试代码,使用morphia

 

@RunWith(JUnit4.class)
public class DbrefTest {
    
    static final Morphia morphia = new Morphia();
    static final Datastore datastore = morphia.createDatastore(new MongoClient(),"BookTest");
    @Entity
    static class Book{
        @Id
        private ObjectId id;//id
        private String name;//书名
        private double price;//价格
        @Reference
        private Author author; 
    }
    @Entity
    static class Author{
        @Id
        private ObjectId id;//id
        private String name;//作者名称
        private String nationality;//国籍
    }
    
    public static void main(String[] args) {
        Author author = new Author();
        author.setName("大仲马");
        author.setNationality("法国");
        datastore.save(author);
        Book book = new Book();
        book.setAuthor(author);
        datastore.save(book);
    }
    
    @Test
    public void testQuery(){
        Query<Book> query = datastore.createQuery(Book.class);
        System.out.println(query.count());
        List<Book> books = query.asList();
        System.out.println(books.get(0).getAuthor().getName());
    }
    
    @Test
    public void testUpdate(){
        //注意根据ID查询不能传入String 必须是ObjectId
        Query<Book> query = datastore.createQuery(Book.class).field("_id").equal(new ObjectId("58ae7f837dde423968454e62"));
//        System.out.println(query.get().price);//直接获取结果集第一个
//        datastore.get(Book.class,new ObjectId("58ae7f837dde423968454e62")).price //直接根据ID查询一个文档
        UpdateOperations<Book> updateOperation = datastore.createUpdateOperations(Book.class).set("name","三个火枪手").set("price", 55);
        datastore.updateFirst(query, updateOperation);//.更新第一个找到的
    }
    
  //聚合管道,投射
  @Test
  public void testAggregation(){
    //把price 重命名为 name     AggregationPipeline aggregationPipeline
= datastore.createAggregation(Book.class).project(Projection.projection("name","price"));     Iterator<Book> books = aggregationPipeline.aggregate(Book.class);     System.out.println(books.next().getName());//打印出name : 60.0   } }

 

转载于:https://www.cnblogs.com/sweetchildomine/p/6434212.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目突然跑不起来报这个错 Exception in monitor thread while connecting to server 10.18.21.79:27117 com.mongodb.MongoSocketReadException: Exception receiving message at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:536) at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:421) at com.mongodb.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:290) at com.mongodb.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) at com.mongodb.connection.CommandHelper.sendAndReceive(CommandHelper.java:84) at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:34) at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:91) at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:51) at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:127) at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at com.mongodb.connection.SocketStream.read(SocketStream.java:84) at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:547) at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:418)
06-09

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值