2017-12-18 236 views
3
{ 
    "_id":"1", 
    "company":"ABCD", 
    "Address":{ 
    "Location":"XYZ" 
    }, 
    "empName":[{ 
    "ID":1, 
    "Name":"test1" 
    }, 
    "ID":2, 
    "Name":"test2" 
    }, 
    "ID":3, 
    "Name":"test3" 
    }] 
} 

現在用mongoTemplate查詢,指定春季蒙戈DB查詢字段預測

Criteria findCriteria1 = Criteria.where("_id").is("1"); 
Criteria find2Criteria = Criteria.where("empName").elemMatch(Criteria.where("ID").is(1)); 
BasicQuery basicQuery = new BasicQuery(findCriteria1.getCriteriaObject(), find2Criteria.getCriteriaObject()); 
mongoTemplate.findOne(basicQuery, ClassName.class); 

,但我的結果,如下面等領域顯示爲空。

{ 
    "_id":"1", 
    "company":null, 
    "Address":null, 
    "empName":[{ 
    "ID":1, 
    "Name":"test1" 
    }] 
} 

我預期的結果應該是這樣的,

"_id":"1", 
"company":"ABCD", 
"Address":{ 
"Location":"XYZ" 
}, 
"empName":[{ 
"ID":1, 
"Name":"test1" 
}] 

能否請你幫我解決這個問題。

由於提前,

回答

0

務必閱讀爲CriteriaBasicQuery的文檔。

在此

BasicQuery basicQuery = new BasicQuery(findCriteria1.getCriteriaObject(), find2Criteria.getCriteriaObject()); 

第二個參數是基本上是一個投影。即您要告訴驅動程序僅提取這些字段中提到的字段。因此其他字段不會被提取,因此爲空。

如果你想獲取所有字段這是你應該在你的情況

Criteria findCriteria1 = Criteria.where("_id").is("1"); 
    Criteria find2Criteria = Criteria.where("empName").elemMatch(Criteria.where("ID").is(1)); 
    BasicQuery basicQuery = new BasicQuery(findCriteria1.andOperator(find2Criteria).getCriteriaObject()); 
+0

感謝@pvpkiran您的評論。因爲對於mongo db無法使用和操作符如下,BasicQuery basicQuery = new BasicQuery(findCriteria1.getCriteriaObject()。andOperator(find2Criteria.getCriteriaObject()); mongoTemplate.findOne(basicQuery,ClassName.class);請你幫忙關於這個? – Vbr

+0

你是什麼意思,無法使用。你是否得到任何錯誤? – pvpkiran

+0

是的,它的編譯錯誤。方法和操作符(DBObject)未定義爲DBObject類型 – Vbr

1

您可以使用下面的代碼做什麼。

您可以鏈接Field類中所需的字段。

Criteria criteria = Criteria.where("_id").is("1"); 
Query query = new Query(criteria); 
query.fields().elemMatch("empName", Criteria.where("ID").is(1)).include("company"); 
mongoTemplate.findOne(query , ClassName.class); 
+0

感謝很多@Veeram它的工作! – Vbr