zoukankan      html  css  js  c++  java
  • 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   } }
  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/sweetchildomine/p/6434212.html
Copyright © 2011-2022 走看看