【问题标题】:MongoDB: adding fields based on partial match query - expression vs queryMongoDB:基于部分匹配查询添加字段 - 表达式与查询
【发布时间】:2018-09-25 07:05:36
【问题描述】:

所以我有一个要查询/汇总的集合。查询由几个部分组成,这些部分是 OR'ed 在一起的。对于查询的每个部分,我都有一组需要显示的特定字段。

所以我希望用一个聚合来做到这一点,这将 $match 查询 OR'ed 一起一次,然后使用 $project$cond 查看需要哪些字段。这里的问题是$cond 使用表达式,而$match 使用查询。这是一个问题,因为某些查询功能不能作为表达式使用。因此,简单的转换不是一种选择。

所以我需要另一个解决方案.. - 我可以对每个单独的查询进行聚合,因为我知道要匹配哪些字段,然后它们将结果合并在一起。但是,如果我在查询中使用分页(限制/跳过等),这将不起作用。 - 找到其他方法来标记每个文档,以便我可以(之后)删除任何不需要的字段。它可能不是超级有效,但会起作用。还不知道怎么做 - 找出一种方法来进行仅由表达式组成的查询。出于我的目的,这可能已经足够好了,这将意味着重写查询解析器。它可以工作,但并不理想。

【问题讨论】:

  • 什么代码?我猜只是几行聚合代码不会真正帮助任何人..

标签: mongodb mongodb-query


【解决方案1】:

我发现了一个使用 $facet 的额外选项。这样,我可以为每个组 opf 字段/子查询创建一个方面。这似乎工作正常,除了结果是带有一堆数组的单个文档。尚不确定如何将其转换回多个文档。

【讨论】:

    【解决方案2】:

    好的,现在我想通了。我还不确定这个解决方案的所有复杂性,但它似乎普遍有效。这里举个例子:

    db.getCollection('somecollection').aggregate(
    [
      {
        "$facet": {
          "f1": [
    
            {
              "$match": {
                <some query 1>
            },
            {
              "$project: {<some fixed field projection>
            }
    
          ],
            "f2": [
            {
              "$match": {
                <some query 1>
              }
            },
            {
              "$project: {<some fixed field projection>
            }
          ]
        }
      },
      {
            $project: {
                  "rt": { $concatArrays: [ "$f1", "$f2"] }
            }
    
      }, 
      { $unwind: { path: "$rt"} },
      { $replaceRoot: {newRoot:"$rt"}}
    ]
    );
    

    【讨论】:

    • 下一个问题:查询可以给你相同的记录,所以需要去重(或更好地合并)。有趣的东西..
    【解决方案3】:

    所以这就是这里的下一个化身。它将去重和合并记录,最后将其再次转换回类似于正常查询结果的内容:

    db.getCollection('somecollection').aggregate(
    [
      {
        "$facet": {
          "f1": [
    
            {
              "$match": {
                <some query 1>
            },
            {
              "$project: {<some fixed field projection>}
            }
    
          ],
            "f2": [
            {
              "$match": {
                <some query 1>
              }
            },
            {
              "$project: {<some fixed field projection>}
            }
          ]
        }
      },
        {
        $project: {
              "rt": { $concatArrays: [ "$f1", "$f2"] }
        }
      }, 
      { $unwind: { path: "$rt"} },
      { $replaceRoot: {newRoot:"$rt"}},
      { $group: {_id: "$_id", items: {$push: {item:"$$ROOT"} } }},
      {
        $project: {
              "rt": { $mergeObjects: "$items" }
        }
      },
      { $replaceRoot: {newRoot:"$rt.item"}},
    ]
    );
    

    可能还有一些优化,所以欢迎任何 cmet

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2013-10-23
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多