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

asl*_*ski 3 full-text-search mongodb node.js mongodb-query node-mongodb-native

直接在MongoDB上运行以下文本搜索没有问题:

db.getCollection('schools').find({
  $text:
    {
      $search: 'some query string',
      $caseSensitive: false,
      $diacriticSensitive: true
    }
}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}})
Run Code Online (Sandbox Code Playgroud)

但是,当尝试使用本机NodeJS驱动程序运行相同的查询时:

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);
      });
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

MongoError: must have $meta projection for all $meta sort keys
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

asl*_*ski 8

OK,根据这个bug,因为3.0.0版本find,并findOne 不再支持fields参数和查询需要如下重写:

collection.find({
        $text:
          {
            $search: filter,
            $caseSensitive: false,
            $diacriticSensitive: true
          }
        })
        .project({ score: { $meta: "textScore" } })
        .sort({score:{$meta:"textScore"}})
Run Code Online (Sandbox Code Playgroud)

  • 那么,为什么他们不更新自己文档中的[textScore排序示例](https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score)相应地?:rolleyes:感谢您指出这一点!可能为我节省了很多时间,特别是因为错误消息不能很好地提示实际错误... (2认同)