MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影

Posted

技术标签:

【中文标题】MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影【英文标题】:MongoError: must have $meta projection for all $meta sort keys using Mongo DB Native NodeJS Driver 【发布时间】:2018-08-05 03:41:54 【问题描述】:

直接在 MongoDB 上运行以下文本搜索不会出现任何问题:

db.getCollection('schools').find(
  $text:
    
      $search: 'some query string',
      $caseSensitive: false,
      $diacriticSensitive: true
    
, score: $meta: "textScore").sort(score:$meta:"textScore")

但是,当尝试使用 native NodeJS driver 运行相同的查询时:

function getSchools(filter) 
  return new Promise(function (resolve, reject) 

    MongoClient.connect('mongodb://localhost:60001', function(err, client) 
      const collection = client.db('schools').collection('schools');

      collection.find(
        $text:
          
            $search: filter,
            $caseSensitive: false,
            $diacriticSensitive: true
          
        , score: $meta: "textScore").sort(score:$meta:"textScore").toArray(function(err, docs) 
        if (err) return reject(err);

        resolve(docs);
      );
    );
  );

我收到以下错误:

MongoError: must have $meta projection for all $meta sort keys

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

在当前版本的原生MongoDB驱动中,需要包含projection key among the options for find

const results = await collection.find(
  
    $text:  $search: filter 
  ,
  
    projection:  score:  $meta: 'textScore'  ,
    sort:  score:  $meta: 'textScore'  ,
  
).toArray();

【讨论】:

【参考方案2】:

好的,根据this bug自3.0.0版本起findfindOneno longer supportfields参数和查询需要改写如下:

collection.find(
        $text:
          
            $search: filter,
            $caseSensitive: false,
            $diacriticSensitive: true
          
        )
        .project( score:  $meta: "textScore"  )
        .sort(score:$meta:"textScore")

【讨论】:

在此处查找文档:mongodb.github.io/node-mongodb-native/3.0/api/… 那么他们为什么不相应地更新textScore sort example in their very own documentation?! :rolleyes: 感谢您指出这一点!可能为我节省了相当多的时间,尤其是因为错误消息并没有很好地提示实际错误...... 嗨,谁能告诉我是否必须按相同查询的相反顺序排序? @Christallkeks 因为这些是 mongo shell 的文档,nodejs 驱动程序文档是 here

以上是关于MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:无效操作,没有批量操作

MongoError:未在 db 上授权执行命令?与 socket.io 连接时

MongoDB 通过 Mlab - MongoError:身份验证失败

MongoError:拓扑已关闭,请连接

MongoError:拓扑被破坏,我该如何修复它? [复制]

mongoDB开启的 --auth 之后,使用 db.eval() 报错MongoError: not authorized on wang to execute command