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

时间:2018-09-29 13:09:13

标签: mongodb aggregation-framework projection

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

如果请求者在目标的friends数组(字符串)中,则phone字段应包括在投影中。如果不是,则将其排除。

在阅读示例here之后,我提出了以下查询。但是,无论如何总是返回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-字符串
firstName-字符串
friends-Array(String)
phone-字符串

指数此收藏集中没有一个

示例

/* 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"}

鲍勃对艾米用户的请求不应返回她的电话号码,因为他不在她的friends数组中。

1 个答案:

答案 0 :(得分:1)

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

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