【问题标题】:Mongoose: How to get back all docs that its flag value is trueMongoose:如何取回其标志值为 true 的所有文档
【发布时间】:2022-01-31 11:27:36
【问题描述】:

我正在使用 mongodb 将我的所有“帖子”存储在我的网站中。 我想查找所有“公开”的文档

我的想法是在每个文档中制作一个标志,以指示帖子是公开的还是私有的......但我不确定这在 mongo 中是否是一个好方法

这是我的 Doc 的方案。它代表一个“帖子”。在其“public”字段中,这反映了它是否公开

这是一个例子:

我想在服务器端过滤它。所以,我用猫鼬来处理这个。

但我不确定这种针对公共/私有的方法或架构设计是否有效。

这是我的想法:

const ObjectId = require("mongodb").ObjectId;
 Post.aggregate([
      {
        $match: { _id: ObjectId(userId) }
      },
      {
        $match: { public: true }
      }

    ])
      .then((posts) => res.send(posts))
      .catch((error) => {
        console.log(error);
        res.sendStatus(400);
      });

看起来很奇怪,效率低下,所以我想对上面的代码提出意见或改进

【问题讨论】:

  • 如何使用私有和公共。如果所有用例都是分开的,请保持单独的集合
  • 我的想法是在每个文档中制作标志以指示它是公共帖子还是私人帖子......但我不确定这是否是 mongo 中的好方法

标签: node.js mongodb mongoose


【解决方案1】:

可以使用公共标志来指示帖子是公开的还是私有的。 您可以尝试以下代码返回所有公共文档。

Post.find({ public: true })
.then((posts) => res.send(posts))
.catch((error) => {
    console.log(error);
    res.sendStatus(400);
});

【讨论】:

  • 您好,请问是否会出现性能问题;例如,我的应用程序中允许发布搜索。所以我可以先索引所有关键字。然后我在第一次搜索中执行我的 post.find({content :keywords})。但是那我该如何像你一开始那样做过滤器呢?
  • 只需在过滤器查询中添加另一个属性.. Post.find({ content: keywords, public: true }) .then((posts) => res.send(posts)) .catch( (error) => { console.log(error); res.sendStatus(400); });
  • 索引是一种特殊的数据结构,它以易于遍历的形式存储集合的一小部分数据集。索引可以提高读取操作的效率,但会带来性能成本。考虑应用程序中每个查询的相对频率以及查询是否证明索引合理。
【解决方案2】:
Post.find({public: true}).then(result => {console.log(result)})

【讨论】:

  • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
猜你喜欢
  • 2021-02-17
  • 2019-07-14
  • 2013-06-16
  • 2020-11-12
  • 2020-11-07
  • 2017-02-28
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多