当前位置: 首页 > 知识库问答 >
问题:

在MondoDB聚合中没有特定字段的筛选器数组元素

段哲圣
2023-03-14

我在mongodb中有一个people集合,如下所示。

MongoDB版本:4.0.13

{
    "_id" : ObjectId("5dcbeb97e184e0f527c6a3e7"),
    "name" : "nithin",
    "age" : 35.0,
    "addresses" : [ 
        {
            "street" : "xyz",
            "city" : "Tvm"
        }, 
        {
            "street" : "pqr",
            "city" : "KLM"
        }, 
        {
            "street" : "abc"
        }
    ]
}


{
    "_id" : ObjectId("5dcbebe4e184e0f527c6a3e8"),
    "name" : "akash",
    "age" : 21.0,
    "addresses" : [ 
        {
            "street" : "lon",
            "city" : "London"
        }, 
        {
            "street" : "par",
            "city" : "paris"
        }, 
        {
            "street" : "abc"
        }
    ]
}
db.getCollection('People').aggregate([

    {
        $project:
        {
            "name":1,
            "age":1,
            "addresses":
            {
                $filter:
                {
                    input:"$addresses",
                    as:"address",
                    cond:{$not:["$$address.city"]}
                }
            }

        }   


    }

])
        $filter:
        {
            input:"$addresses",
            as:"address",
            cond:{"$exists":["$$address.city":true]}
        }

共有1个答案

空英达
2023-03-14

在这种情况下不需要有聚合。您可以使用find和$elemmatch运算符:

db.people.find({
    addresses: {$elemMatch : {city: {$exists: false}}}
})

但是如果要使用聚合,则可以对同一查询进行匹配:

db.people.aggregate([
    {$match: {addresses: {$elemMatch : {city: {$exists: false}}}}}
])

或者,您也可以像下面所示那样进行操作,但我假设elemMatch的工作速度会更快:

db.people.aggregate([
{$unwind: '$addresses'},
{$match: {"addresses.city" : {$exists: false}}}
{$group: { _id : '$_id', addresses: {$addToSet: "$addresses"}}}
])
 类似资料:
  • 抱歉发了这么长的帖子! 我有一个Mongo收藏,包含以下文档: 我想查询这些文档,并返回每个名称的最大值条目,因此我想要的结果集(顺序无关紧要)是: 如果我想在C#中做完全相同的事情,我会使用: 使用聚合管道,我已经达到了: 这给了我以下结果集: 如您所见,我有一个文档数组,每个文档都包含一个“_id”字段(名称)和一个“highest”字段(实际文档)。 这将用C表示为: 我想知道的是,是否可以

  • 我有一个包含嵌套文档集合的文档: 映射如下所示: 我想做的是下一个聚合: 通过这样的查询,我得到的结果如下所示: 但我想要的是,只有带有键轮的结果才会出现在结果存储桶中(或与whe搜索字符串匹配的任何其他结果)。 希望问题足够清楚。我做错了什么?是否有任何建议或更改数据结构或查询? UPD:添加my\u custom\u analyzer以供参考:

  • 我有一个四阶段聚合查询,其形式为match->group->project->sort。聚合工作正常,并生成如下所示的数组。 下面是我的聚合查询。我有没有办法只显示“计数”字段大于500的结果?我试图添加到项目阶段,但没有运气。

  • 我在lexer语法文件中编写并用antlr4编译它。上面说 看来“filter”只适用于ANTLR3 我查了wikihttp://www.antlr.org/wiki/display/antlr4/options,没有找到答案。“filter”关键字也不在源文件https://github.com/antlr/antlr4/blob/master/tool/src/org/antlr/v4/too

  • 我想过滤掉字段'a'等于'a'的文档,同时我想对字段'a'进行刻面处理,当然不包括前面的过滤器。我知道您可以将筛选器放在查询的“外部”,以便在不应用该筛选器的情况下获得方面,例如: 弹性搜索 索尔尔 也就是说,对于方面A,我希望保留除A:A以外的所有过滤器,对于方面B,我希望保留除B:B以外的所有过滤器,以此类推。最明显的方法是执行n个查询(n个方面中的每一个),但我不想这样做。

  • 我有以下收藏: 我试图将电影(及其所有细节)与用户状态和对该电影的感觉相匹配,并使用聚合: 其中返回: 我希望的结果是匹配user_status中的第一部电影,以获得最终结果: 我想我的下一步是: 但是它不起作用——不确定这个$addFields是否正确,我知道的一个问题是,我的第一个_id是一个ObjectId,第二个似乎是一个字符串。