因此,我有一个要查询/集合的集合。该查询由几部分组成,这些部分进行“或”运算。对于查询的每个部分,我都有一组特定的字段需要显示。
所以我希望通过汇总来做到这一点,该查询将 $ match 一次全部或在一起,然后将 $ project 与 $ cond 以查看需要哪些字段。这里的问题是 $ cond 使用表达式,而 $ match 使用查询。这是一个问题,因为某些查询功能无法用作表达式。因此,简单的转换不是一种选择。
所以我需要另一个解决方案。 -我可以对每个单独的查询进行汇总,因为我知道要匹配的字段,并且它们将结果合并在一起。但是,如果我在查询中使用分页(限制/跳过等),则将无法使用。 -寻找其他标记每个文档的方法,以便我可以(之后)删除不需要的任何字段。它可能不是非常高效,但是会起作用。尚不知道该怎么做 -找出一种仅由表达式组成的查询方式。对我而言,这可能已经足够好了,这将意味着重写查询解析器。它可以工作,但不理想。
答案 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"}},
]
);
可能还会有一些优化,因此欢迎任何评论