我正在努力在投影阶段过滤嵌套数组。
实际的匹配条件更复杂,但是这样就可以了:
db.collection.insertMany([
{ "id": 0,
"list_L1": [
{ "obj_L1": {
"list_L2": [
{id: "000", go: "Y"},
{id: "001", go: "N"},
{id: "002", go: "N"} ]}}]},
{ "id": 1,
"list_L1": [
{ "obj_L1": {
"list_L2": [
{id: "100", go: "Y"},
{id: "101", go: "Y"},
{id: "102", go: "N"} ]}}]},
{
"id": 2,
"list_L1": [
{ "obj_L1": {
"list_L2": [
{id: "200",go: "N"},
{id: "201",go: "N"},
{id: "202",go: "N"} ]}}]}
]);
db.collection.aggregate([
{$match: { "list_L1.obj_L1.list_L2.go": "Y"}}
]);
(如果格式很奇怪请原谅 - 我想节省垂直空间)
这样可以过滤文档,但是我还被要求仅保留匹配的元素list_L2
,从而产生如下结果:
[
{ "_id": ObjectId("5a934e000102030405000000"),
"id": 0,
"list_L1": [
{ "obj_L1": {
"list_L2": [
{id: "000", go: "Y"} ]}}},
{ "_id": ObjectId("5a934e000102030405000001"),
"id": 1,
"list_L1": [
{ "obj_L1": {
"list_L2": [
{id: "100", go: "Y"},
{id: "101", go: "Y"}} ]}}}
]
如果文档只有list_L1
它就不会很难,但我无法“看到”两层深度的值;这会返回空数组:
db.collection.aggregate([
{$match: { "list_L1.obj_L1.list_L2.go": "Y"}},
{$addFields: { "list_L1.obj_L1.list_L2": {
$filter: {
input: "$list_L1.obj_L1.list_L2",
cond: { $eq: ["$$this.go","Y"] }}}}}
]);
[
{
"_id": ObjectId("5a934e000102030405000000"),
"list_L1": [
{ "obj_L1": {
"list_L2": [] }}]},
{
"_id": ObjectId("5a934e000102030405000001"),
"list_L1": [
{
"obj_L1": {
"list_L2": [] }}]}
]
那么,在匹配我想要的内容后,如何过滤内部数组? 或者,我可以删除所有文档中不匹配的元素,然后过滤非空元素,但我对此还不太熟悉。