【问题标题】:How can I give elements in a MongoDB array a key? Node.js如何给 MongoDB 数组中的元素一个键?节点.js
【发布时间】:2020-08-09 19:48:32
【问题描述】:

我在一个文档中有一个元素数组(它们是子文档)。最初这个字段只是一个对象,我可以用它来轻松访问嵌套对象,例如

fieldName[objectKey]

但这是在意识到您可以将模式存储在模式中之前!现在我有一个这些对象的数组,如果不遍历整个数组并查询每个对象,就无法找到其中一个。

Here's an example MongoDB Compass Screenshot

最初这个对象是 guildId 键的值,现在是模式中的一个字段。理想情况下,如果我可以将其从架构中取出并将其设置为对象的键,那就太好了!

【问题讨论】:

  • 我不太明白这个问题。即使现在嵌套在数组中,您仍然可以查询字段。例如,db.coll.find({"captchas.solved":true}) 将返回包含至少一个未解决的验证码的所有文档。
  • @thisDotAdam 你可能想看看这篇关于 MongoDocs 的数据建模模式的文章 (docs.mongodb.com/manual/core/data-model-design)

标签: node.js mongodb discord.js


【解决方案1】:

还有另一个选项可能会对您有所帮助。您可以将此 guild 嵌入式文档存储在另一个集合中。使用它自己的架构。并且仅将 guild_id 引用存储在您的原始架构中,例如:

value: "MD17",
captchas: [guild_id1, guild_id2, ..., guild_idN]

然后通过聚合框架通过这样的查询请求它:

your_model_name.aggregate([
            {
                $match: {
                    field: value_for_match
                }
            },
            {
                $lookup: {
                    from: "guilds", 
                    localField: "captchas",
                    foreignField: "_id", //make sure that guild_collection id is safe as reference
                    as: "guilds"
                }
            }
]}

甚至在$lookup阶段之后匹配必要的嵌入式公会文档

【讨论】:

    【解决方案2】:

    我想出了如何在 MongoDb 中使用地图而不是使用数组。这将允许我通过它的'键访问一个对象!

    captchas: {
        type: Map, 
        of: captchaSchema.schema
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2021-12-24
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多