【问题标题】:How to create "in" operator query for multiple fields?如何为多个字段创建“in”运算符查询?
【发布时间】:2019-10-27 21:43:26
【问题描述】:

我有一个收藏

db.list.insert({ first: "apple", second: "banana" });
db.list.insert({ first: "apple", second: "tree" });
db.list.insert({ first: "orange", second: "tree" });
db.list.insert({ first: "medal", second: "sport" });

我想根据这两个字段查询文档,只有当两个字段匹配时才获取文档。

我尝试了以下查询

db.list.find(
  $or: [
     { first: 'apple', second: { $in: ['tree', 'banana']}},
     { first: 'orange', second: { $in: ['tree']}}
  ],
).limit(5);

并为

添加索引
{first: 1, second: 1}

在查询计划中,它生成的计划数量与“或”查询中的谓词数量相同。大约有 200 万个文档,如果它在第一个谓词中没有得到它的 5 个文档,那么它会获取与所有谓词匹配的所有文档并且查询超时。 有没有其他有效的方法来做到这一点?

【问题讨论】:

  • 还有其他方法,但过滤器将保持不变。你能告诉集合中的条目数和查询结果中的谓词数超时吗?
  • 条目数约为 200 万,并且在“或”查询中超时约 5 个谓词。

标签: mongodb mongodb-query query-performance mongodb-indexes


【解决方案1】:

您可以使用 $facet 使用 mongodb 聚合管道。这将确保文档只被获取一次。这是示例查询

    db.list.aggregate([
    {
        $facet: {
            "condition_1": [
                {
                    "$match": { first: 'apple', second: { $in: ['tree', 'banana']}}
                },
                {
                    "limit": 5
                }
            ],
            "condition_2": [
                {
                    "$match": { first: 'orange', second: { $in: ['tree']}}
                },
                {
                    "limit": 5
                }
            ]
        }
    }
], {allowDiskUse: true})

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2020-03-02
    • 2014-10-18
    • 2019-12-05
    • 2021-11-18
    • 2014-11-12
    • 2012-05-21
    • 2020-06-06
    相关资源
    最近更新 更多