【问题标题】:MongoDB Java Driver - Use exists projection in find queryMongoDB Java 驱动程序 - 在查找查询中使用存在投影
【发布时间】:2013-04-09 12:45:01
【问题描述】:

我想获取字段下载不存在的所有文档

find{ "download" : {$exists: false}}

对于 Java,我找到了一个示例:

  BasicDBObject neQuery = new BasicDBObject();
  neQuery.put("number", new BasicDBObject("$ne", 4));
  DBCursor cursor = collection.find(neQuery);

  while(cursor.hasNext()) {
    System.out.println(cursor.next());
  }

我的适应是

      BasicDBObject field = new BasicDBObject();
      field.put("entities.media", 1);
  field.put("download", new BasicDBObject("$exists",false));
  System.out.println("Start Find");
  DBCursor  cursor = collection.find(query,field);      
      System.out.println("End Find Start Loop ALL 100k");
   int i = 1;
                while(cursor.hasNext())

Exists Line 不起作用:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: com.mongodb.MongoException: Unsupported projection option: $exists
        at com.mongodb.MongoException.parse(MongoException.java:82)
        at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:314)
        at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
        at com.mongodb.DBCursor._check(DBCursor.java:368)
        at com.mongodb.DBCursor._hasNext(DBCursor.java:459)
        at com.mongodb.DBCursor.hasNext(DBCursor.java:484)
        at ImgToDisk.main(ImgToDisk.java:61)
        ... 5 more

现在不知道正确的适应是什么,因为我的查询在 shell 和 UMongo 中工作,转移到 java 似乎不是那么容易看到。

【问题讨论】:

  • 您在 find() 调用中引用了一个查询对象。将其包含在示例中可能会有所帮助

标签: java mongodb bson mongo-java


【解决方案1】:

你使用

collection.find(query,field);

作为 find 方法的第二个参数的 DBObject 用于指示要返回的结果文档的哪些属性。这对于减少网络负载很有用。

在您的示例中,您尝试将 $exists 子句放入 field DBObject。那是行不通的。 第二个参数对象的属性值只能是1(包含该属性)或0(排除)。

改为将其放入名为 query 的第一个 DBObject 中。

另见herehere

【讨论】:

    【解决方案2】:

    您可以通过 JAVA API 使用 DBCollection 来做到这一点

    public List<BasicDBObject> Query(String collection, Map<String, String> query, String... excludes) {
    BasicDBObject bquery = new BasicDBObject(query);
    BasicDBObject bexcludes = new BasicDBObject(excludes.length);
    for (String ex : excludes) {
      bexcludes.append(ex, false);
    }
    return db.getCollection(collection, BasicDBObject.class).find(bquery).projection(bexcludes)
        .into(new ArrayList<BasicDBObject>());
    

    }

    db 是MongoDataBase

    【讨论】:

      【解决方案3】:

      我们需要指定两件事。

      第一:

      collection.find(query,field);
      

      上述命令不是来自 MongoDB Java 驱动程序。 这意味着我们只能在 mongo shell(或 mongo Compass)中运行,而不能在 java 中运行。

      第二: 要限制java中的字段,您可以使用projection(),如下代码

      find(queryFilter)
      .projection(fields(include("title", "year"),exclude("_id")))
      

      完整示例:

      Bson queryFilter = eq("cast", "Salma Hayek");
      //or Document queryFilter = new Document("cast", "Salma Hayek");
      
      Document result =
              collection
                  .find(queryFilter)
                  //.limit(1)  if you want to limit the result 
      
                  .projection(fields(include("title", "year"),exclude("_id")))
             //or .projection(fields(include("title", "year"), excludeId()))
             //or .projection(new Document("title", 1).append("year", 1))
                  .iterator()
                  .tryNext();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        • 2018-09-19
        • 1970-01-01
        • 2017-03-06
        • 2016-05-15
        相关资源
        最近更新 更多