簡體   English   中英

MongoDB Java 驅動程序 - 在查找查詢中使用存在投影

[英]MongoDB Java Driver - Use exists projection in find query

我想獲取不存在字段下載的所有文檔

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 行不工作:

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 似乎並不那么容易看到。

你用

collection.find(query,field);

作為 find 方法的第二個參數的 DBObject 用於指示要返回的結果文檔的哪些屬性。 它對於減少網絡負載很有用。

在您的示例中,您嘗試將 $exists 子句放入field DBObject 中。 那行不通。 第二個參數對象的屬性值只能為 1(包括此屬性)或 0(排除)。

將其放入名為query的第一個 DBObject 中。

另請參閱此處此處

您可以使用 DBCollection 通過 JAVA API 來做到這一點

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

我們需要指定兩件事。

第一的 :

collection.find(query,field);

上面的命令不是來自 MongoDB Java 驅動程序。 這意味着我們只能在 mongo shell(或在 mongo Compass 中)而不是在 java.lang.

第二:要限制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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM