【发布时间】:2018-09-29 13:09:12
【问题描述】:
我想从数据库中获取一个用户。我的函数接受一个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();
}
Schema(在 Compass 中创建,因此无需代码):userId - StringfirstName - Stringfriends - 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"}
Bob 对 Amy 用户的请求不应返回她的电话号码,因为他不在她的 friends 数组中。
【问题讨论】:
-
使用
$filter聚合。 stackoverflow.com/questions/3985214/… -
你能发布架构吗?
-
@AnthonyWinzlet 我不清楚
$filter将如何提供帮助。我不想从friends数组中获取任何结果,我只是想检查该参数是否在该数组中,以便我可以包含或排除一个完全独立的字段。 -
好的,你能发布示例数据吗
标签: mongodb aggregation-framework projection