有条件地排除不在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
-StringfirstName
-Stringfriends
-数组(字符串)电话
-字符串
指数:
此集合中没有
示例:
/* 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
数组中得到任何结果,我只想检查参数是否在该数组中,以便我可以包含或排除一个完全独立的字段。好的,您可以发布示例数据吗