如何查询(在MongoDB中)此嵌套的json结构,以便仅获取具有位置" 值等于"currentPosition" 值的嵌套对象?
How can I query (in MongoDB) this nested json structure in order to get only the nested object which has the "position" value equal to "currentPosition" value?
{ "JobId": "123" "currentPosition" : NumberInt(18), "details" : [ { "position": NumberInt(18), "fname" : "Alexander", "lname" : "A", }, { "position": NumberInt(18), "fname" : "Doug", "lname" : "D", }, { "position": NumberInt(15), "fname" : "Bruce", "lname" : "B", }, { "position": NumberInt(10), "fname" : "Tom", "lname" : "T", } ] }目前,我正在通过python代码实现此目标:获取整个文档并遍历详细信息列表,以查找位置"值等于"currentPosition"值的对象.
Currently I am achieveing this by python code: getting the entire document and looping through the details list in order to find object with "position" value equal to "currentPosition" value.
最终输出看起来像
{ "JobId": "123" "currentPosition" : NumberInt(18), "details" : [ { "position": NumberInt(18), "fname" : "Alexander", "lname" : "A", }, { "position": NumberInt(18), "fname" : "Doug", "lname" : "D", } ] }推荐答案
您将需要使用聚合框架.
You will need to use the aggregation framework for this.
details需要展开,以便您可以过滤掉不必要的详细信息.
details needs to be unwinded so that you can filter out the unnecessary details.
在$unwind阶段之后,您将有4个文档在管道中.在下一步中,您可以使用$match过滤掉您关心的细节.
After the $unwind stage you will have 4 documents in the pipeline. In the next stage you then use a $match to filter out the details you care about.
这意味着您将获得2个文档,这些文档具有相同的JobId和currentPosition,但具有不同的details
This means that as a result you will get 2 documents with the same JobId and currentPosition, but with different details
docs.mongodb/manual/reference/operator /aggregation/unwind
db.getCollection("DELETE_ME").aggregate( [ { $unwind: { path : "$details", } }, { $match: { "$expr": {"$eq": ["$details.position", "$currentPosition"]} } }, ] );会返回
{ "_id" : ObjectId("---"), "JobId" : "123", "currentPosition" : NumberInt(18), "details" : { "position" : NumberInt(18), "fname" : "Alexander", "lname" : "A" } } { "_id" : ObjectId("---"), "JobId" : "123", "currentPosition" : NumberInt(18), "details" : { "position" : NumberInt(18), "fname" : "Doug", "lname" : "D" } }更多推荐
具有嵌套结构的MongoDB查询
发布评论