Массив фильтров и документ в MongoDB

#javascript #node.js #mongodb #mongoose

Вопрос:

Схема

 [
    {
        _id:"doc1",
        type:"SR",
        title:"...",
        description:"...",
        author:"5",
        posts:[
            {
                author:"1",
                title:"..."
            },
            {
                author:"2",
                title:"..."
            },
            {
                author:"1",
                title:"..."
            }
        ]
    },
    {
        _id:"doc2",
        type:"SA",
        title:"...",
        description:"...",
        posts:[],
        author:"5"
    }
]
 

Каждый документ будет иметь тип или SA или SR . Если тип есть SA , то posts это будет пустой массив, в противном случае он будет непустым.

Теперь я хочу получить элементы документа и массива на основе определенных условий.

  • если тип есть SA , а authorId=5 затем верните весь документ.
  • если тип SR равен, то верните элементы сообщений, в которых authorId=1

Если тип SA , то я хотел бы получить title,description,.. документ, в противном случае получите posts фильтр по.

Мой Вопрос

Использование мангуста

 Blog.find({
            $or: [
                {
                    $and: [
                        { type: "SA" },
                        { authorId:"5" }
                    ]
                },
                {
                    "posts.authorId": "1"
                }
            ]
        }, {
            posts: {
                $filter: {
                    input: "$posts",
                    as: "post",
                    cond: {
                        $eq: ["$post.authorId", "1"]
                    }
                }
            }
        })
            .then(posts => {
                console.log(posts)
            })
            .catch(err => {
                console.log(err);
            })
 

Возвращенный документ

 [
    {
        _id:"doc1",
        posts:[ 
            {
                author:"1",
                title:"..."
            },
            {
                author:"1",
                title:"..."
            }
        ]
    },
    {
        _id:"doc2",
        posts:[]
    }
]
 

Как я могу включить другой атрибут doc2 ?

Комментарии:

1. Вы можете спроецировать его с помощью фильтра, например mongoplayground.net/p/4eoi049XBeY

2. @varman Но, он также вернет title и type сообщения, в котором нет автора = 5

3.Пример: для doc1 title и type возвращается, что не предназначено

4. Если вам нужно удалить определенные поля при каком-либо условии, вам нужно перейти к агрегациям. Вы упомянули, что вам не нужны другие поля, кроме сообщений типа= «SR» … когда вы составляете карту в мангусте, вы можете просто игнорировать эти файлы, нет!! даже если эти поля прилагаются ко всем документам!

5. @varman я думаю, что мне нужно обработать все данные на сервере после повторного доступа из mongodb