【问题标题】:Return a json from inside a schema in MongoDB从 MongoDB 的模式中返回一个 json
【发布时间】:2017-08-04 19:32:30
【问题描述】:

我有以下文件:

{
  "id": "someString",
  "servers": [
    {
      "name": "ServerName",
      "bases": [
        {
          "name": "Base 1",
          "status": true
        },
        {
          "name": "Base 2",
          "status": false
        }
      ]
    }
  ]
}

我想创建一个 API 路由来获取一个 json,其中只包含状态为 true 的碱基名称。

我当前项目的依赖项是:

"dependencies": {
    "basic-auth": "^1.1.0",
    "body-parser": "~1.0.1",
    "express": "~4.0.0",
    "mongoose": "~4.6.8",
    "mongoose-unique-validator": "^1.0.4",
    "morgan": "~1.0.0"
  }

感谢任何帮助! 谢谢!

@编辑

忘了提一下,我正在使用 mongoose.Schema 来构建对象:

var ClienteSchema = new Schema({
  id: { type: String, required: true, unique: true },
  servers: [{
    nome : String,
    bases: [{
      nome: String,
      status: Boolean
    }]
  }]
});

困难在于导航到Cliente > servers > bases 以获取status 并返回基地的nome... :(

【问题讨论】:

  • 您是否尝试过在 find 方法中使用带有一些查询参数的 db.find()?
  • db.yourcollection.find({servers : {bases : {status : true}}});应该返回你想要的所有值
  • @mnemosdev 我有这个:router.route('/backup/:id') .get(auth, (req,res) => { Cliente.find({ id : req.params.id }, (err, result) => { (err) ? res.send(err) : res.json(result); }); });
  • 该查询返回单个 json 对象,而不是要从中搜索的对象集合
  • 你有 2 个选项,第一个也是最简单的方法是在从 mongoDB 取回节点后处理节点中的数据,第二个是在 mongoDB 中进行查找聚合

标签: javascript json node.js mongodb mongoose


【解决方案1】:

您可以使用以下聚合。

下面的查询使用$map 来遍历servers 数组并保留name 并后跟$filter 以保持basesstatus 值为true 以转换输出。

Model.aggregate({
    $project: {
        id: 1,
        servers: {
            $map: {
                input: "$servers",
                as: "server",
                in: {
                    name: "$$server.name",
                    bases: {
                        $filter: {
                            input: "$$server.bases",
                            as: "base",
                            cond: {
                                $eq: ["$$base.status", true]
                            }
                        }
                    }
                }
            }
        }
    }
}).exec(function(err, user) {
    console.log(JSON.stringify(user));
})

示例响应:

{
    "id": "someString",
    "servers": [{
        "name": "ServerName",
        "bases": [{
            "name": "Base 1",
            "status": true
        }]
    }]
}

【讨论】:

  • 该死的,我在这段代码中有点迷失,但工作正常。只返回我的 status : true 基地。我必须研究这段代码和 mongoDB 聚合才能更好地理解那里发生的事情!
  • 不错的答案,他可以遍历返回的 json 对象
  • @mnemosdev 是的,您可以在客户端执行此操作。这只是另一种选择。
  • @veeram 不能在查询返回文档后在服务器端执行此操作吗?
  • @mnemosdev 是的,这就是我在之前评论中的意思。您可以使用 JavaScript 来完成。
【解决方案2】:

我假设您的文档是 Mongo 模型。如果是这样,我将其命名为 Foo。

var Foo = require(./path/to/foo);

Foo.find({ 'servers.bases.status': true })
    .select('servers.bases.name')
    .exec(function(err, name) {
         // your business
    });
});

如果我误解了这个问题,请告诉我。

【讨论】:

  • 不会返回所有甚至 1 server.bases.status 为真的记录。
  • OP 有一个文档,他从中派生出多个真假服务器状态,这可以找到多个服务器,但不能很好地与他在自己问题的 cmets 中发布的 OP 代码绑定
  • 这是 OP 写的 router.route('/backup/:id') .get(auth, (req,res) => { Cliente.find({ id : req.params.id }, (err, result) => { (err) ? res.send(err) : res.json(result); }); });
  • @NERDYLIZARD 该代码可以很好地列出来自服务器的所有碱基,但甚至返回了statusfalse 的碱基,有没有办法只返回status : true 碱基?
  • @ViníciusRufine 哦,如果状态为布尔值,请尝试使用 true 而不是 'true'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多