有条件地排除不在MongoDB中工作的字段

有条件地排除不在MongoDB中工作的字段,mongodb,aggregation-framework,projection,Mongodb,Aggregation Framework,Projection,我想从数据库中获取一个用户。我的函数接受一个requesterId,它是请求此数据的用户的ID,以及一个targetId,它是要检索的用户 如果请求者在目标的朋友数组(字符串)中,则电话字段应包含在投影中。如果没有,则排除在外 在阅读示例之后,我提出了以下查询。但是,无论发生什么情况,phone字段始终返回。我做错了什么 getUser: function getUser(requesterId, targetId) { return db.collection('users').a

我想从数据库中获取一个用户。我的函数接受一个
requesterId
,它是请求此数据的用户的ID,以及一个
targetId
,它是要检索的用户

如果请求者在目标的
朋友
数组(字符串)中,则
电话
字段应包含在投影中。如果没有,则排除在外

在阅读示例之后,我提出了以下查询。但是,无论发生什么情况,
phone
字段始终返回。我做错了什么

  getUser: function getUser(requesterId, targetId) {
    return db.collection('users').aggregate([
      {$match: {userId: targetId}},
      {
        $project:
          {
            firstName: 1,
            phone: {
              $cond: {
                if: {friends: requesterId},
                then: "$phone",
                else: "$$REMOVE"
              }
            }
          }
      },
      {$limit: 1}
    ]).toArray();
  }
模式(在Compass中创建,因此没有代码):
userId
-String
firstName
-String
friends
-数组(字符串)
电话
-字符串

指数: 此集合中没有

示例

/* Bob's MongoDB data */ {userId: "BobID", firstName: "Bob", friends: ["AmyID"], phone: "1234567890"}
getUser(requesterId = 'AmyID', targetId = 'BobID');
/* Result */ {firstName: "Bob", phone: "1234567890"}

/* Amy's MongoDB data */ {userId: "AmyID", firstName: "Amy", friends: ["CassieID"], phone: "9876543210"}
getUser(requesterId = 'BobID', targetId = 'AmyID');
/* Result */ {firstName: "Amy", phone: "987654321"}

Bob对Amy用户的请求不应返回她的电话号码,因为他不在她的
朋友
数组中。

if:
值必须是布尔表达式,而不是查询对象。要检查数组中是否存在指定值,可以使用以下表达式:

db.collection('users').aggregate([
  {$match: {userId: targetId}},
  {
    $project:
      {
        firstName: 1,
        phone: {
          $cond: {
            if: {$in: [requesterId, '$friends']},
            then: "$phone",
            else: "$$REMOVE"
          }
        }
      }
  },
  {$limit: 1}
])

使用
$filter
聚合。你能发布模式吗?@AnthonyWinzlet我不清楚
$filter
在这里有什么帮助。我不想从
friends
数组中得到任何结果,我只想检查参数是否在该数组中,以便我可以包含或排除一个完全独立的字段。好的,您可以发布示例数据吗