【问题标题】:Nodejs Mongodb get first element of array using find without aggregateNodejs Mongodb使用不聚合的find获取数组的第一个元素
【发布时间】:2018-10-11 15:46:23
【问题描述】:

我正在使用 Mongodb NodeJs 驱动程序在我的数据库中查找一个值。我的集合的对象结构是:

{
    '_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();

我省略了与情况无关的 try catch 语句。

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

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]}},
}

我得到的这些错误基本上是不支持这些功能。

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

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

是否可以使用find 获得此值,还是只能使用aggregate 获得?

版本:

"mongodb": "3.1.6"

【问题讨论】:

  • 不,如果不使用 mongodb 中的聚合函数,您将无法添加或投影字段。
  • @AnthonyWinzlet 是否有任何文件说明这一点?我的意思是,我可以在查找选项中使用projection 对普通字段进行投影,但为什么我不能在这个投影中获得数组的第一个元素?谢谢!
  • 您可以使用$slice 获取第一个元素,但在同一字段中,即myList。但不能在查找查询/投影中添加另一个firstElement

标签: node.js mongodb


【解决方案1】:

the positional $ operator 从数组中返回第一个元素。您的预测必须类似于

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

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 2011-01-11
    • 2021-08-22
    • 2019-05-26
    • 2020-07-21
    • 2017-03-12
    • 2011-11-05
    • 2010-12-27
    相关资源
    最近更新 更多