如何根据数组中元素的位置使用spring mongo数据进行查询

时间:2017-08-24 16:43:05

标签: mongodb mongodb-query spring-data-mongodb

我有一个mongo集合“test”,其中包含类似的元素(节点数组是一个有意义且有意义的顺序):

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

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

我正在使用spring Criteria尝试构建一个mongo查询,该查询将向我返回“ subID ”等于用户输入ID' inputID '和' superiorID '位置不在' inputID '之前(如果高级ID在子网中不需要的ID。

所以例如,如果我的用户输入是3,我不想拉第一个文档,但我想要拉第二个文档(首先有一个优先级存在于节点之前,因为userInput节点第二个的高级id不是等于用户输入。)

我知道$ indexOfArray函数存在,但我不知道如何将其转换为Criteria。

2 个答案:

答案 0 :(得分:1)

您可以通过聚合框架获得您要查找的结果。我已经为您做了一个详尽的询问,以显示您应该寻找的内容。这回来了 对于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"]}
            } 
      }
    }
}
])

答案 1 :(得分:0)

db.collection.find({nodes.2.subID:2})该查询将从nodes字段中查找第2个元素subid。