【问题标题】:Most efficient way to get all value for a field in MongoDB & Node.js获取 MongoDB 和 Node.js 中字段的所有值的最有效方法
【发布时间】:2013-11-21 14:14:38
【问题描述】:

所以我对 MongoDB 和文档存储的东西真的很陌生。我很难找到最优雅、最有效的解决方案来执行以下操作:

我有一个名为测试的集合。在每个测试中,都有一个字段所有者的操作。见下文:

{
"_id" : ObjectId("528c731a810761651c00000f"),
"actions" : [
    {
        "action" : "6784",
        "owner" : "MERCHAND_1",
        "_id" : ObjectId("528c7292810761651c00000e")
    },
    {
        "action" : "1",
        "owner" : "MERCHAND_1",
        "_id" : ObjectId("528c7292810761651c00000d")
    },
    {
        "action" : "1358",
        "owner" : "MERCHAND_2",
        "_id" : ObjectId("528c7292810761651c00000c")
    }
],
"name" : "Test 1",
"product" : ObjectId("528bc4b3a0f5430812000010")

}

如何使用 Node.js 和 MongoDB 获得每个不同所有者值的列表(数组)(我使用的是 mongoose 驱动程序)。在 mongoside 或 node.js 端做这件事更好吗?例如,如果我在上一张表上运行该函数,它应该返回:

[
    {
      "owner":"MERCHAND_1"
    },
    {
      "owner":"MERCHAND_2"
    }
]

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    MongoDB 支持distinct 命令来执行此操作。在这种情况下,您可以使用点表示法来定位数组中的字段。在外壳中:

    db.test.distinct('actions.owner')
    

    输出:

    [
      "MERCHAND_1",
      "MERCHAND_2"
    ]
    

    【讨论】:

      【解决方案2】:

      您可以使用 MongoDB 的命令来做到这一点

      db.runCommand({
        distinct: 'tests',
        key: 'actions.owner'
      });
      

      给你

      {
        "values" : [
          "MERCHAND_1",
          "MERCHAND_2"
        ],
        "stats" : {...},
        "ok" : 1
      }
      

      这将包括tests 集合中的每个文档。但是,如果您只想检查单个文档,则可以将命令重写为

      db.runCommand({
        distinct: 'tests',
        key: 'actions.owner',
        query: { _id: ObjectId("528c731a810761651c00000f") }
      });
      

      【讨论】:

      • 谢谢你,这就是我需要知道的。 runCommand 和直接调用不同的函数有什么区别?
      • db.collection.distinct() 方法为distinct 命令提供了一个包装器。它实际上是在后台调用命令,但不返回 statsok 属性。
      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      相关资源
      最近更新 更多