如何使用 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"]}
}
}
}
}
])
我有一个 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"]}
}
}
}
}
])