2017-08-29 3 views
0

私のような配列の基本的なモンゴドキュメント持っているのであれば:MongoDb - arrayのelement1の位置がelement2の位置よりも小さい文書を見つける方法?

{ 
    myId: 1 
    nodes: [ 
    {nodeId: 1}, 
    {nodeId: 2}, 
    {nodeId: 3} 
    ] 
} 

または

{ 
    myId: 1 
    nodes: [ 
    {nodeId: 2}, 
    {nodeId: 3}, 
    {nodeId: 1} 
    ] 
} 

を私はのnodeIdの位置すべてのドキュメントを検索するクエリを持つようにしたい:2配列内のノード数が、nodeId:1未満です。上の例では、nodeId:nodeIdの前に2が表示されているので、2番目の文書を取り戻したいだけです。1

答えて

2

$indexofArray$redactを組み合わせて使用​​できます。

$ltインデックスを比較し、$$KEEP条件が満たされたときに文書$$PRUNE文書を削除します。

何か

db.collection_name.aggregate({ 
    "$redact": { 
    "$cond": [ 
     { 
     "$lt": [ 
      { 
      "$indexOfArray": [ 
       "$nodes.nodeId", 
       2 
      ] 
      }, 
      { 
      "$indexOfArray": [ 
       "$nodes.nodeId", 
       1 
      ] 
      } 
     ] 
     }, 
     "$$KEEP", 
     "$$PRUNE" 
    ] 
    } 
}) 

よう

モンゴDB Javaドライバコード:

MongoClient mongoClient = new MongoClient(); 
MongoDatabase database = mongoClient.getDatabase("db_name"); 
MongoCollection<Document> mongoCollection = database.getCollection("collection_name"); 
Document query = Document.parse("{\n" + 
       " \"$redact\": {\n" + 
       " \"$cond\": [\n" + 
       "  {\n" + 
       "  \"$lt\": [\n" + 
       "   {\n" + 
       "   \"$indexOfArray\": [\n" + 
       "    \"$nodes.nodeId\",\n" + 
       "    2\n" + 
       "   ]\n" + 
       "   },\n" + 
       "   {\n" + 
       "   \"$indexOfArray\": [\n" + 
       "    \"$nodes.nodeId\",\n" + 
       "    1\n" + 
       "   ]\n" + 
       "   }\n" + 
       "  ]\n" + 
       "  },\n" + 
       "  \"$$KEEP\",\n" + 
       "  \"$$PRUNE\"\n" + 
       " ]\n" + 
       " }\n" + 
       "}"); 
List<Document> documents = mongoCollection.aggregate(Arrays.asList(query)).into(new ArrayList<>()); 
+0

ありがとう!どのように投影とフィルタでこれを行うための任意のアイデア? – Locke

+0

Np。あなたはmongo javaドライバの実装を指していますか? – Veeram

+0

イェップ私は午前。これをjavaに変換すると問題が発生しました – Locke

関連する問題