【问题标题】:Express/MongoDB: how to get a value from a nested fieldExpress/MongoDB:如何从嵌套字段中获取值
【发布时间】:2017-11-06 10:37:28
【问题描述】:

首先我很抱歉,如果我没有使用正确的单词或者问题很愚蠢,我对此很陌生并且仍在学习,这次我无法通过搜索找到答案!

我有一个 MEAN 项目,我想从我的前端数据库中获取一个值(我使用 Angular 4)。所以我尝试在 Express 上编写一个函数,但事实是我不知道如何,因为我什至无法直接在 mongo 的命令行中获取值。

我的架构具有这种格式:

const userSchema = mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },
    item: {
        item1: {
            type: Number,
            default: 0
        },
        item2: {
            type: Number,
            default: 0
        },
        item3: {
            type: Number,
            default: 0
        }
    }
});

想法是每个用户都有一个包含特定数量的每个项目的库存,我的目标是在使用项目名称进行请求时获取这个特定数量。

但我能做的最好的事情是 db.users.find({}, {item:1});有了它,我得到了带有它们的值的整个项目列表,我尝试的所有其他事情都让我出错。所以也许我的架构不对?

所以我的问题是: 知道我目前无法直接从 mongo 获取值,我如何才能通过将项目名称作为参数传递来仅使用 Express 获取项目值?

知道答案也将帮助我知道以后如何更改此值。

感谢您的阅读!

[编辑] 此主题被标记为与此主题重复: How to query nested objects?

但是我已经看到了另一个话题,所以是的,有:

db.users.find({ item : { item1 : "0" }}).count();

我可以得到值,但它对我一点帮助都没有,因为你必须写值才能得到值....但我想在不知道值的情况下进行查询,因为这个值会改变。

另外,我需要更多关于 Express 方面的建议。

谢谢。

【问题讨论】:

    标签: mongodb express mongodb-query mean-stack database-schema


    【解决方案1】:

    查询应该是这样的:

    db.users.find({ username: "someuser" }, { "item.item1": 1, "_id": 0 })
    

    1 表示要获取该字段,不代表其值。 _id 通常总是返回,所以我将它设置为 0 以在这种特殊情况下不返回它。项目名称作为参数传递;在这种情况下,它是 item1

    查询将返回如下内容:

    { "item" : [ { "item1" : 123 } ] }
    

    它是普通的 JSON,因此可以轻松提取值。

    在 Mongoose 中是这样的:

    const itemname = 'item1';
    
    User
      .findOne(
        { username: 'someuser' },
        { [`item.${itemname}`]: true, _id: false },
        (err, result) => {
          const response = {};
    
          if (err) {
            response.status = HttpStatus.INTERNAL_SERVER_ERROR;
            response.message = err;
          } else {
            response.status = HttpStatus.OK;
            response.message = result.item[itemname];
          }
    
          return res.status(response.status).json(response.message);
        }
      );
    

    没有适当的错误处理。如果用户不存在、没有 item 字段等,代码 sn-p 会失败。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2012-04-20
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      相关资源
      最近更新 更多