项目元素在顺序位置

时间:2018-01-16 10:18:25

标签: mongodb bson mongo-shell

我有一个查询返回第一个元素等于字符串的文档。

示例文件:

{
    "_id" : 1,
    "personal" : {
        "gender" : "Male",
        "given_names" : [ 
            "Trent", 
            "Paul"
        ],
        "surname" : "James",
        "date_of_birth" : ISODate("1984-04-28T23:00:00.000Z")
    },
    enrollments: [{
        "start_date" : ISODate("2003-01-29T00:00:00.000Z"),
        "name" : "Psychology",
        "school" : "Humanities",
        "score" : 27
    }] 
}

查询:

db.students.find({
    'personal.given_names.0': 'Trent'
})

我想只投射第一个元素。我尝试过使用$slice

db.students.find({
    'personal.given_names.0': 'Trent'
}, {
    'personal.given_names': {
        $slice: 1
    }
})

这确实将数组限制为第一个,但是预测其他所有内容。我还尝试将1$slice运算符传递给投影,但如果看起来1总是覆盖$slice(无论是否排序)。

'personal.given_names': [1, { $slice: 1 }]
'personal.given_names': [ { $slice: 1 }, 1 ]

我也尝试直接引用序数位置:

'personal.given_names.0': 1

如何只输出 数组的第一个元素?

2 个答案:

答案 0 :(得分:1)

试试这个

db.students.find({ 
    'personal.given_names': 'Trent'
}, {
    'personal.given_names.$': 1
})//removed ".0" from find

答案 1 :(得分:0)

使用聚合框架,您可以这样做:

db.students.aggregate({
    $match: { 'personal.given_names.0': 'Trent' } // find matching documents only
}, {
    $project: {
        '_id': 0, // remove "_id" field from output (and kind of everything else)
        'nameInArray': { $slice: [ '$personal.given_names', 1 ] }, // return only the first element of the array but still as an array
        'nameOnly': { $arrayElemAt: [ '$personal.given_names', 0 ] }// return only the first element of the array
    }
})