这是我的收藏
{
"_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});
但是我不想比较只是打印数组索引。如何获得单个结果? 任何帮助表示赞赏。.
答案 0 :(得分:1)
您可以$unwind
和includeArrayIndex
来获取地址数组的索引
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)
}
>
答案 1 :(得分: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