我有一个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。
答案 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。