【问题标题】:how can I create my mongodb query based on the input from the user in node.js?如何根据 node.js 中用户的输入创建我的 mongodb 查询?
【发布时间】:2017-04-25 13:33:11
【问题描述】:

目前在我的应用程序中,我存储了不同的论坛帖子。用户可以添加新消息并创建新帖子。 其他用户 - 在显示内容时 - 可以对其进行过滤,这样他们就不会看到他们之前阻止的特定用户上传的内容。

每个用户都表示为device_id 和display_name 的组合。

当用户获取内容时,他们会执行 post 查询并包含一组先前被阻止的用户:

"blockedUsers": (
{
    "device_id" = "XXX";
    "display_name" = XXX;
},
{
    "device_id" = "YYY";
    "display_name" = YYY;
}
)

目前有可能使用一些注册的 display_name 或匿名添加内容。

现在我只支持过滤带有一些 display_name 的用户:

if(blockedUsers) {
    var excludedUsernames = [];

    for(var i in blockedUsers) {
         excludedUsernames.push(blockedUsers[i]['display_name']);
    }

    query.$and.push({ 'display_name': { $nin: excludedUsernames } });
}

这很好 - 当用户注册并有一些 display_name(与 anonymous 不同)时 - 我不关心他的 device_id,我只关心通过他的 display_name 阻止他。

但是,当一些匿名用户之前被屏蔽时:

"blockedUsers": (
{
    "device_id" = "XXX";
    "display_name" = "anonymous"; //represents anonymous user
},
{
    "device_id" = "YYY";
    "display_name" = "anonymous"; //represents anonymous user
}
)

我需要通过device_id 和 display_name == anonymous 排除他的帖子。在那种情况下,当有一些 device_id 但包含 display_name != anonymous - 我不想阻止它。

我不知道如何更新我的查询以使其满足上述要求,您能帮我解决这个问题吗?谢谢!

【问题讨论】:

  • 我认为您的帖子在您第一次发布时没有得到答复,因为您很难理解您的要求。为了澄清起见,使用伪代码,我是否更正了您要解决的查询是:!((displayName IN arrayOfBlockedNames)OR(displayName == 'anonymous' AND device_id IN arrayOfBlockedDevices))。我说的对吗?
  • 保罗,是的,你是对的

标签: javascript node.js mongodb mongodb-query


【解决方案1】:

如果我理解得很好:

  • 如果用户有一个被禁止的device_id,则阻止他
  • 如果用户有一个被禁止的display_name,则阻止他

在那种情况下,他是否是anonymous并不重要。


let excludedUsernames, excludedDevices;

blockedUsers.forEach((e) => {
    excludedUsernames.puhs({ e["display_name"] });
    excludedDevices.push({ e["device_id"] });
});

query.$and.push({ 'display_name' : { $nin: excludedUsernames } });
query.$and.push({ 'device_id'    : { $nin: excludedDevices   } });

编辑

query.$or.push({
    $and: [
        { 'device_id'    : { $nin: excludedDevices }},
        { 'display_name' : "anonymous" }
    ]
});
query.$or.push({ 'display_name' : { $nin: excludedUsernames } });

【讨论】:

  • 是的,几乎 - 还有一件事 - 用户可以使用相同的 device_id,但不同的 display_names 访问我的应用程序。然后我只需要在 display_name == 匿名时阻止一个 device_id。
  • 编辑了我的答案。
  • 感谢您的帮助!我不得不稍微修改代码,现在它看起来像这样:excludedUsernames.push({display_name:e['display_name']}); excludedDevices.push({device_id:e['device_id']});(在它引发错误之前),但是现在我在query.$or.push({ $and: [... 行中遇到另一个错误 - 它说:TypeError: Cannot read property 'push' of undefined
  • 那是因为你的对象query没有属性$or。在你第一次初始化它的地方,你必须指定一个$and 属性。将其更改为$or。
  • 感谢您的帮助,我发现您的回答非常有帮助!目前我正在解决不同的问题,也许你能帮助我,我在这里发布了一个问题stackoverflow.com/questions/41212600/…
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 2015-08-14
  • 2021-11-18
  • 2017-09-11
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多