2017-08-24 27 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。