2017-03-16 43 views
0

我正在編寫一個查詢以僅處理數組中的一個項目,但查詢正在返回整個數組。發現查詢返回數組中的所有項目,儘管只查詢一個

我有這樣的數據的集合:

"testScenarioId":"100", 
"testSteps":[ 

    { 
    "edit":false, 
    "controlId":1450419683150, 
    "controlName":"scanTextBox", 
    "objProp":"id->articleSearch_scanViewPopup_field", 
    "objPropType":15, 
    "action":{ 
     "id":6 
    }, 
    "screenId":1450419663920, 
    "screenName":"Order.Scan", 
    "applicationId":4, 
    "applicationName":"GSM", 
    "testCaseId":"100", 
    "index":1, 
    "testStepNumber":"1" 
    }, 
    { 
    "edit":false, 
    "controlId":1450419683894, 
    "controlName":"scansearchbutton", 
    "objProp":"id->articleSearch_scanViewPopup_field_HelpIcon", 
    "objPropType":17, 
    "action":{ 
     "id":2 
    }, 
    "screenId":1450419663920, 
    "screenName":"Order.Scan", 
    "applicationId":4, 
    "applicationName":"GSM", 
    "testCaseId":"100", 
    "index":2, 
    "testStepNumber":"2" 
    }]} 

我想基於標準"testScenarioId" : "100""testSteps.testStepNumber" : "1"更新集合;這意味着,當我運行此命令的testSteps數組中的第一個文件必須更新,如下圖所示

{

"edit":false, 
"controlId":1450419683150, 
"controlName":"scanTextBox", 
"objProp":"id->articleSearch_scanViewPopup_field", 
"objPropType":15, 
"action":{ 
    "id":6 
}, 
"screenId":1450419663920, 
"screenName":"Order.Scan", 
"applicationId":4, 
"applicationName":"GSM", 
"testCaseId":"100", 
"index":1, 
"testStepNumber":"1" 

}

但讓我吃驚:

db.TestSteps.find({"testScenarioId":"100","testSteps.testStepNumber":"1"}) 

在mongo shell中,我得到了全部是這個文件在testSteps數組中。

編輯:我想知道的Java代碼,以更新使用上述條件的陣列中的一文件。

在此先感謝。

+2

喜非難和歡迎堆棧溢出。請記住,find查詢中的條件僅確定集合中的哪些文檔被返回;它們不會影響返回中包含哪些子文檔(在數組中)。 要從數組中返回一個項目,您需要查看聚合查詢中的[unwind operator](https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/)。 –

回答

0

查詢的文檔

您可以在findprojection參數使用$ projection operator

find命令的語法是:

find(query, projection) 

所以這應該工作:

db.TestSteps.find({"testScenarioId":"100","testSteps.testStepNumber":"1"}, { 'testSteps.$': 1 }) 
  • 注意,當您指定的projection,只有選定的領域會出現,所以如果你需要返回其他字段,將它們添加到你的投影。 瞭解更多關於投影here

更新文件

要基於搜索的數組元素的更新,你也可以你的$:

​​

中$既定的目標$ operator只是在查詢中匹配的第一個數組元素

使用find,修改它獲取的元素,並將其保存回

您需要:

  1. 從文檔獲取文檔與數組元素
  2. 只提取元素
  3. 將元素修改爲你想要的
  4. 將它保存回原位置 - 覆蓋原始元素


var doc = db.TestSteps.findOne({"testScenarioId":"100","testSteps.testStepNumber":"1"}, { 'testSteps.$': 1 }); 
var the_element = doc.testSteps[0]; 
var updated_element = changeThisElement(the_element); 
db.TestSteps.update(
    {"testScenarioId":"100","testSteps.testStepNumber":"1"}, 
    {$set: { 'testSteps.$': updated_element }} 
) 
+0

嗨Marmor, 感謝您的回覆。 mongo shell命令正在工作,我得到一個匹配的文檔。現在我想通過java來更新它,使用從UI獲得的對象。更確切地說,如果我在UI中更新記錄,完整記錄作爲對象將被傳遞給java函數作爲參數進行更新,以獲取mongodb中更新的記錄。 對不起,如果我不清楚我的問題。 – razz

+0

好吧,我在js中添加了適合你的代碼,但需要轉換爲Java。沒有測試過,希望這對你有用... – marmor

+0

謝謝你這麼多,你讓我的生活變得輕鬆:)。 我能寫出邏輯 – razz

0

嘗試增加在查找查詢$elemMatch

db.TestSteps.find({"testScenarioId":"100", "testSteps": $elemMatch: {"testStepNumber":"1"}}) 
+0

Hi Vishwa, 謝謝您的查詢。提供的查詢引發語法錯誤。我在下面修改後啓動它, db.TestSteps.find({「testScenarioId」:「100」,「testSteps」:{$ elemMatch:{「testStepNumber」:「1」}}})我還在testSteps數組中的所有文檔 – razz

0

你需要添加投影。

db.TestSteps.find({ "testScenarioId":"100"},{"testSteps": { $elemMatch: {"testStepNumber":"1" } } })