MongoDB删除或限制字段条件聚合
我在编写find/aggregate mongo查询时遇到了一些问题,我的要求是获取所有文档,但条件如下:MongoDB删除或限制字段条件聚合,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我在编写find/aggregate mongo查询时遇到了一些问题,我的要求是获取所有文档,但条件如下: const privateLimitationArray = ['updatedAt', 'createdAt', 'email', 'lname', 'friendslist', '__v']; const publicLimitationArray = ['updatedAt', 'createdAt', '__v']; YourModel.aggregate([
const privateLimitationArray = ['updatedAt', 'createdAt', 'email', 'lname', 'friendslist', '__v'];
const publicLimitationArray = ['updatedAt', 'createdAt', '__v'];
YourModel.aggregate([
{
$match: {
// Your query to find by
}
}, {
"$addFields": condition(privateLimitationArray, publicLimitationArray)
}
])
.then(result => {
// handle result
})
.catch(error => {
// handle error
});
假设我有两个文档:
{
_id: 5ccaa76939d95d395791efd2,
name: 'John Doe',
email: 'john.doe@foobar.com',
private: true
}
{
_id: 5ccaa76939d95d395791efd2,
name: 'Jane Doe',
email: 'jane.doe@foobar.com',
private: false
}
现在,我试图了解的问题是,如果private字段为true,那么当我查询时,我必须获取除电子邮件字段以外的所有文档,如果private为true,则不包括这些文档,如下所示:
{
_id: 5ccaa76939d95d395791efd2,
name: 'John Doe',
private: true
}
{
_id: 5ccaa76939d95d395791efd2,
name: 'Jane Doe',
email: 'jane.doe@foobar.com',
private: false
}
在聚合中尝试了$redact、$cond、$$PRUNE、$$down,并且遇到了$$REMOVE,看起来这是最新的功能,但无法获得所需的输出。请帮助我完成查询您可以使用$$REMOVE从返回的文档中删除字段
db.collection.aggregate([
{ "$addFields": {
"email": {
"$cond": [
{ "$eq": ["$private", true] },
"$$REMOVE",
"$email"
]
}
}}
])
谢谢Anthony Winzlet,他的解决方案非常有效 如果任何人面临相同的问题,并且需要包含1个以上的字段,我将通过编写以下方法来实现:
function condition(privateFieldLimitationArray, publicFieldLimitationArray) {
const condition = {};
privateFieldLimitationArray.map((d, i) => {
condition[d] = {
"$cond": [
{ "$eq": ["$private", true] },
"$$REMOVE",
publicFieldLimitationArray.includes(d) ? '$$REMOVE' : '$'+d
]
}
});
return condition;
}
然后,您可以使用上述功能,如:
const privateLimitationArray = ['updatedAt', 'createdAt', 'email', 'lname', 'friendslist', '__v'];
const publicLimitationArray = ['updatedAt', 'createdAt', '__v'];
YourModel.aggregate([
{
$match: {
// Your query to find by
}
}, {
"$addFields": condition(privateLimitationArray, publicLimitationArray)
}
])
.then(result => {
// handle result
})
.catch(error => {
// handle error
});
非常感谢您的提问,这确实有效。!!