#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
сообщения, в котором нет автора = 53.Пример: для
doc1
title
иtype
возвращается, что не предназначено4. Если вам нужно удалить определенные поля при каком-либо условии, вам нужно перейти к агрегациям. Вы упомянули, что вам не нужны другие поля, кроме сообщений типа= «SR» … когда вы составляете карту в мангусте, вы можете просто игнорировать эти файлы, нет!! даже если эти поля прилагаются ко всем документам!
5. @varman я думаю, что мне нужно обработать все данные на сервере после повторного доступа из mongodb