【问题标题】:Get index of an element mongodb aggregation获取元素 mongodb 聚合的索引
【发布时间】:2019-05-26 17:59:33
【问题描述】:

这是我的收藏

{
        "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
        "name" : "Sherlock",
        "mobile" : "999999",
        "adress" : [
                {
                        "street" : "221b baker street",
                        "city" : "london"
                },
                {
                        "street" : "ben street",
                        "city" : "london"
                }
        ],
        "tags" : [
                "Detective",
                "Magician",
                "Avenger"
        ]
}

现在我想获取地址数组中的第一个或第二个值。 为此,我正在使用此命令。

> db.agents.findOne({"name" : "Sherlock"},{"adress" : 1})

但不是给出单个结果,而是给出整个数组,如

{
        "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
        "adress" : [
                {
                        "street" : "221b baker street",
                        "city" : "london"
                },
                {
                        "street" : "ben street",
                        "city" : "london"
                }
        ]
}

可以通过比较数组值来完成

 db.agents.find({"adress.street": "ben street"}, {_id: 0, 'adress.$': 1});

但我不想仅仅为了打印数组索引而进行比较。我怎样才能得到单一的结果? 任何帮助表示赞赏..

【问题讨论】:

    标签: arrays database mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$arrayElemAt从数组中获取特定元素

    db.collection.aggregate([
      { $addFields: { "$arrayElemAt": ["$adress", 0] }}   //index
    ])
    

    如果你想获得切片元素,那么你可以使用$slice 投影

    db.collection.find({}, { adress: { $slice: [2, 1] }})  // 2 index and 1 number of element
    

    【讨论】:

    • 我能够通过切片获取数组元素,其中 2 似乎是偏移量,而 1 是限制。但是对于第一个,您如何创建 $addfields 值。我读到它是综合使用的,但它给出了错误。不接受 $addfields 中的 '$' 并在删除它之后出现管道错误。
    • 你的mongdb版本是多少?
    【解决方案2】:

    $unwindincludeArrayIndex可以得到地址数组的索引

    db.t11.aggregate([
        {$match : {"adress.street" : "ben street"}},
        {$unwind : {path : "$adress", includeArrayIndex : "idx"}},
        {$match : {"adress.street" : "ben street"}}
    ]).pretty()
    

    您可以添加$project 过滤不需要的字段

    结果

    > db.t11.aggregate([{$match : {"adress.street" : "ben street"}},{$unwind : {path : "$adress", includeArrayIndex : "idx"}},{$match : {"adress.street" : "ben street"}}]).pretty()
    {
            "_id" : ObjectId("5c225f9a66d39d55c036fa66"),
            "name" : "Sherlock",
            "mobile" : "999999",
            "adress" : {
                    "street" : "ben street",
                    "city" : "london"
            },
            "tags" : [
                    "Detective",
                    "Magician",
                    "Avenger"
            ],
            "idx" : NumberLong(1)
    }
    >
    

    【讨论】:

    • 感谢您的努力,但我不想在查询中使用街道名称或任何内容。我只想通过数组索引加载地址。我该怎么做。
    猜你喜欢
    • 2015-11-14
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2011-06-16
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多