2017-08-24 28 views
1

我有一個mongo集合「測試」,其中包含像這樣的元素(節點數組是一個集合和有意義的順序):如何使用彈簧蒙戈數據來查詢基於數組中元素的位置

 "test" : { 
     "superiorID" : 1, 
     "nodes" : [ 
      { 
       "subID" : 2 
      }, 
      { 
       "subID" : 1 
      }, 
      { 
       "subID" : 3 
      } 
     ] 
     } 

 "test" : { 
     "superiorID" : 4, 
     "nodes" : [ 
      { 
       "subID" : 2 
      }, 
      { 
       "subID" : 1 
      }, 
      { 
       "subID" : 3 
      } 
     ] 
     } 

我使用的春天標準,試圖建立一個蒙戈查詢將返回給我哪裏有「的subID」等於用戶輸入ID「輸入的所有元素ID「和」 superiorID「位置不是之前」 inputID'(如果上級id爲即使在其中不需要的副IDS)。

因此,例如,如果我的用戶輸入是3我不想拉第一個文檔,但我想拉第二個文檔(首先有一個存在於節點之前的用戶輸入節點第二個上級ID是不等於用戶輸入)。

我知道$ indexOfArray函數存在,但我不知道如何將其轉換爲Criteria。

+0

可能是我不正確理解這個。像'db.collection_name.find({「nodes.subID」:3,「superiorID」:{「$ gt」:3}})'應該適合你。你可以將代碼添加到您嘗試過的帖子中嗎? – Veeram

回答

1

您可以通過聚合框架獲得您正在查找的結果。我爲你做了一個speude查詢,以顯示你應該找的東西。這會返回 對於doc1,showMe = false,對於doc2,showMe = true,您可以明顯地匹配它。這個查詢不需要2個項目階段,我只做了一個工作查詢,這個查詢也易於閱讀。這不會是一個非常快的查詢。如果你想快速查詢,你可能想重新考慮你的數據結構。

db.getCollection('test').aggregate([ 
{ "$project": 
    { 
     "superiorIndex": {"$indexOfArray" : [ "$nodes.subID","$superiorID" ]}, 
     "inputIndex": {"$indexOfArray" : [ "$nodes.subID",3 ]}, 
    } 
}, 
{ "$project": 
    { 
     "showMe" : 
     { 
      $cond: 
      { 
       if: { $eq: [ "$superiorIndex", -1 ] }, 
       then: true, 
       else: {$gt:[ "$superiorIndex","$inputIndex"]} 
      } 
     } 
    } 
} 
]) 
0

db.collection.find({nodes.2.subID:2})該查詢將從節點字段中查找第2個元素subid。