Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB删除或限制字段条件聚合_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB删除或限制字段条件聚合

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([

我在编写find/aggregate mongo查询时遇到了一些问题,我的要求是获取所有文档,但条件如下:

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
    });



非常感谢您的提问,这确实有效。!!