我想从数据库中获取用户。我的函数接受一个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
数组中。
答案 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}
])