MongoDB:基于部分匹配查询添加字段-表达式与查询

时间:2018-09-25 07:05:36

标签: mongodb mongodb-query

因此,我有一个要查询/集合的集合。该查询由几部分组成,这些部分进行“或”运算。对于查询的每个部分,我都有一组特定的字段需要显示。

所以我希望通过汇总来做到这一点,该查询将 $ match 一次全部或在一起,然后将 $ project $ cond 以查看需要哪些字段。这里的问题是 $ cond 使用表达式,而 $ match 使用查询。这是一个问题,因为某些查询功能无法用作表达式。因此,简单的转换不是一种选择。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好的,现在我知道了。我还不确定该解决方案的所有复杂性,但它似乎总的来说是可行的。下面是一个示例:

<StackPanel x:Key="sp" x:Shared="False" Orientation="Horizontal" Height="25" Width="90">
    <Image Source="screen.png" Width="20" Margin="3 0"></Image>
    <TextBlock VerticalAlignment="Center" Margin="15 0">Save</TextBlock>
</StackPanel>

<Style TargetType="Button" x:Key="SaveButton">
    <Style.Resources>
    </Style.Resources>
    <Setter Property="Margin" Value="5"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Width" Value="98"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Content" Value="{StaticResource sp}" />
</Style>

答案 2 :(得分:0)

所以这是这里的下一个化身。它将对重复数据进行重复数据删除和合并,最后将其再次转换回类似于普通查询结果的内容:

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"}},
]
);

可能还会有一些优化,因此欢迎任何评论