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

How do I use spring mongo data to query based on the position of an element in an array

我有一个 mongo 集合 "test",其中包含如下元素(节点数组是一组有意义的顺序):

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

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

我正在使用 spring 条件来尝试构建一个 mongo 查询,该查询将 return 给我所有包含 'subID 的元素' 等于用户输入 ID 'inputID' 并且 'superiorID' 位置不在 ' inputID'(如果上级id在子id中偶数则不需要)。

因此,例如,如果我的用户输入是 3,我不想提取第一个文档,但我想提取第二个文档(第一个有一个上级存在于 userInput 节点之前的节点中,第二个上级 ID不等于用户输入)。

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

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

您可以通过聚合框架得到您要找的结果。我已经为您进行了 speude 查询,以显示您应该寻找的内容。这个returns showMe = false 对于 doc1 和 showMe = true 对于 doc2,你可以很明显地匹配。对于此查询,您不需要 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"]}
            } 
      }
    }
}
])