获取元素 mongodb 聚合的索引

shu*_*ade 5 database arrays mongodb mongodb-query aggregation-framework

这是我的收藏

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

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

> db.agents.findOne({"name" : "Sherlock"},{"adress" : 1})
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Ash*_*shh 2

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

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

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

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