MongoDB投影查询,过滤内数组匹配元素中的字段
MongoDB projection query, filter field in matching element of inner array
我有一个包含数组的文档。像这样:
"_id" : ObjectId("55101f81e4b07caf8554b9b1"),
"myId" : "1222222",
"isDelayed" : false,
"status" : "BALLS",
"yellow" : false,
"white" : true,
"people" : [
{
"peopleId" : 222222,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
{
"peopleId" : 33312,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
...
我有一个如下所示的 mongo 查询,在集合 mycoll
中,如果 myId=1.222
在人员数组中,如果 people.peopleId=1123
它 returns第一场比赛:
db.getCollection('mycoll').find(
{myId:'1.222',
people: { $elemMatch: { peopleId: 1123 }
}
},{"people.$": 1 }).pretty();
结果包括数组中人员条目中的所有字段:
"people" : [
{
"peopleId" : 1122,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
如何从内部数组的 匹配 条目中过滤仅 returns 所需字段的回复,比如 "status"
?我可以为外部文档生成过滤器,但不能为数组元素中的字段生成过滤器。
您可以使用聚合来做到这一点。您需要做的是:
- 将文档与所需的
myId
匹配。
- 展开
people
数组,以便 people
中的每个子文档有一个文档。
- 匹配指定的
peopleId
.
- 根据需要项目字段。
db.mycoll.aggregate([
{ "$match": { "myId": "1.222"} },
{ "$unwind": "$people" },
{ "$match": { "people.peopleId": 1123 }},
{ "$project": { "peopleId": "$people.peopleId",
"status": "$people.status" }
}
]).pretty();
Mongo $elemMatch in projection 用于投影以找出您案例中的特定字段 status
下面的查询 return 仅 status
字段
db.collectionName.find({"myId":"1222222"},{"people":{"$elemMatch":{"peopleId":33312}},"people.status":1}).pretty()
我有一个包含数组的文档。像这样:
"_id" : ObjectId("55101f81e4b07caf8554b9b1"),
"myId" : "1222222",
"isDelayed" : false,
"status" : "BALLS",
"yellow" : false,
"white" : true,
"people" : [
{
"peopleId" : 222222,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
{
"peopleId" : 33312,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
...
我有一个如下所示的 mongo 查询,在集合 mycoll
中,如果 myId=1.222
在人员数组中,如果 people.peopleId=1123
它 returns第一场比赛:
db.getCollection('mycoll').find(
{myId:'1.222',
people: { $elemMatch: { peopleId: 1123 }
}
},{"people.$": 1 }).pretty();
结果包括数组中人员条目中的所有字段:
"people" : [
{
"peopleId" : 1122,
"bc" : 0,
"status" : "live",
"fc" : 1,
"tc": 4,
"rc": "yellow"
},
如何从内部数组的 匹配 条目中过滤仅 returns 所需字段的回复,比如 "status"
?我可以为外部文档生成过滤器,但不能为数组元素中的字段生成过滤器。
您可以使用聚合来做到这一点。您需要做的是:
- 将文档与所需的
myId
匹配。 - 展开
people
数组,以便people
中的每个子文档有一个文档。 - 匹配指定的
peopleId
. - 根据需要项目字段。
db.mycoll.aggregate([
{ "$match": { "myId": "1.222"} },
{ "$unwind": "$people" },
{ "$match": { "people.peopleId": 1123 }},
{ "$project": { "peopleId": "$people.peopleId",
"status": "$people.status" }
}
]).pretty();
Mongo $elemMatch in projection 用于投影以找出您案例中的特定字段 status
下面的查询 return 仅 status
字段
db.collectionName.find({"myId":"1222222"},{"people":{"$elemMatch":{"peopleId":33312}},"people.status":1}).pretty()