【发布时间】:2015-03-20 05:23:34
【问题描述】:
谁能解释一下这个 mongodb 查询:-
@Query("{'$or':[{owner:?0, companyId:?1, status:?2},{companyId:?1, membersDetails:{'$elemMatch':{memberId:?0, status:?2}}}]}")
【问题讨论】:
标签: java mongodb mongodb-query spring-data-mongodb
谁能解释一下这个 mongodb 查询:-
@Query("{'$or':[{owner:?0, companyId:?1, status:?2},{companyId:?1, membersDetails:{'$elemMatch':{memberId:?0, status:?2}}}]}")
【问题讨论】:
标签: java mongodb mongodb-query spring-data-mongodb
这是一个Spring Data annotation,将附加到类似这样的方法签名:
@Query("{'$or':[{owner:?0, companyId:?1, status:?2},{companyId:?1, membersDetails:{'$elemMatch':{memberId:?0, status:?2}}}]}")
List<MyClass> findByClassThings(String owner, String companyId, String status);
或者任何实际调用的方法以及适当的类型。
查询将作用于存储中的数据,如下所示:
{
"owner": "A",
"companyId": "B",
"status": "C",
"membersDetails": [
{ "memberId": "B", "status": "X" },
{ "memberId": "C", "status": "C" },
]
},
{
"owner": "B",
"companyId": "B",
"status": "C",
"membersDetails": [
{ "memberId": "A", "status": "C" }
]
}
所以当这个方法被这样调用时:
List<MyClass> results = MyClass.findByClassThings("A","B","C");
它会匹配这两个文档,原因如下:
第一个文档匹配是因为“owner”、“companyId”和“status”中的元素将第一个查询元素中指定的所有提供参数与$or 表达式匹配:
{owner:"A", companyId:"B", status:"C"}`
第二个文档匹配,因为提供的字段都存在于$or 条件的第二个查询元素中。 “companyId”出现在文档的顶部,“status”是一个数组元素的匹配项,该数组元素也具有与第一个参数相同的匹配值的“memberId”:
{companyId:"B", membersDetails:{'$elemMatch':{memberId:"A", status:"C"}}}
在后一种情况下,$elemMatch 要求“两个”条件“必须”出现在为单个元素查询的数组元素中。
【讨论】:
试试这个
db.collection.find({$or: [{'owner': ?0, 'companyId': ?1, status:?2}, {'companyId': ?1, 'membersDetails': {'$elemMatch':{memberId:?0, status:?2}}}]});
谢谢
【讨论】: