代码之家  ›  专栏  ›  技术社区  ›  c-chavez

Nodejs Mongodb使用find without aggregate获取数组的第一个元素

  •  0
  • c-chavez  · 技术社区  · 7 年前

    我使用mongodbnodejs驱动程序在我的数据库中找到一个值。我的收藏的对象结构是:

    {
        '_id': ObjectId(),
        'name': ''
        'myList': []
    }
    

    我需要过滤数组中至少有一个元素的文档,并返回值,包括列表和该列表的第一个元素(在单独的属性中)。我想知道是否可以不使用聚合来执行此操作,但我无法返回列表的第一个元素。

    查找值的代码是:

    let dbClient = await MongoClient.connect(myDbUrl, {useNewUrlParser: true});
    let database = dbClient.db(myDatabase);
    
    let query = {
        myList: {$exists: true, $not: {$size: 0}},
    };
    
    let options = {
        projection: {
    
        }
    }
    
    let result = await database.collection(myCollection).find(query, options).toArray();
    
    dbClient.close();
    

    到目前为止,我已经尝试过(没有成功):

    let options = {
       projection: {
            'myList.0': 1
        }
    }
    
    let options = {
       projection: {
            '$myList.0': 1
        }
    }
    
    let options = {
       projection: {
            firstElement: { 'myList.0': 1 }
        }
    }
    
    let options = {
        projection: {
            firstElement: {$arrayElemAt: ['$myList', 0]},
        }
    }
    
    let options = {
        $project: {firstElement: {$arrayElemAt: ['$myList', 0]}},
    }
    

    我遇到的错误基本上是这些函数不受支持。

    我知道使用aggregate我可以将其添加到查询管道以获得所需的投影:

    {$project: {firstElement: {$arrayElemAt: ['$myList', 0]}}},
    

    是否可以使用 find ,还是只有在 aggregate

    版本:

    "mongodb": "3.1.6"
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Alex Blex    7 年前

    the positional $ operator

    let options = {
       projection: {
            'myList.$': 1
        }
    }