是否可以使用查询select和他的索引选择数组中的元素?

时间:2016-04-18 03:44:17

标签: node.js mongodb mongoose

有一个架构:

{model.js}

var someSchema = new mongoose.Schema({
    a : [Number],
    b : String,
    c : [Number],
    d : Number
});

我尝试 find()每个文档,并从a中选择一个元素,从c中选择具有相同索引的元素和b。

这就是我的尝试:

{get.js}

var some = require('model');
some.find() // find
    .limit(3) // limit for 3 docs (test part)
                            // NEXT LINE IS NOT WORKING
    .select('a.0 b c.0 -d') // select {array: a and b, index:0}, b less d
    .exec(function(err, dataList) {
        if (err) {
            console.warn(err);
            return ;
        }
        console.log(data[0].a); // Show in console array a
        console.log(data[0].b); // String b
        console.log(data[0].c); // array c
                                // not select d, so d = undefined
    });

在这部分代码中,我可以选择这样的数组索引,但是当我尝试这段代码时,我的数组被选中但内部没有元素。

有没有办法从架构中选择数组的索引?

1 个答案:

答案 0 :(得分:1)

你想要$slice来代替:

some.find()
    .limit(3)
    .select({ 
        "a": { "$slice": 1 },
        "b": 1,
        "c": { "$slice": 1 }
    })
    .exec(function(err,dataList) {

对于第一个元素,只需要返回的数字,或者通过索引位置然后返回的数字。所以对于第二个索引,它将是:

some.find()
    .limit(3)
    .select({ 
        "a": { "$slice": [1,1] },
        "b": 1,
        "c": { "$slice": [1,1] }
    })
    .exec(function(err,dataList) {

这需要将“完整对象”形式的投影提供给.select()语句,或以.find()作为投影参数提供。

另请注意,预测只是“完全”包含列表或“排除”。你不能“混合”包含或排除