Node.js & MongoDB 无法规范化查询

Node.js & MongoDB Can't canonicalize query

我有一个在服务器上运行了 6 个月的 NodeJS 脚本,这周我设置了一个新服务器并安装了所有更新版本的软件,包括 mongojs、nodejs 和 mongodb,并且不知何故,我的代码不再有效了。

部分代码:

 collect.findOne({$or: [{from_id: enviou, to_id: viu}, {from_id: viu, to_id: enviou}]}, {sort: {$natural: -1}}, function (err, echoData) {
    if (err || !echoData) {
        console.log("No messages found -rv",err);
    } else {
       console.log(echoData);
    }
});

给我错误:

{ [MongoError: Can't canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.]
  name: 'MongoError',
  message: 'Can\'t canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.',
  '$err': 'Can\'t canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.',
  code: 17287 }


这部分:

collect.find({$or: [{from_id: de, to_id: para}, {from_id: para, to_id: de}]}, {skip: skipCount, limit: useDbLimit, sort: {time: 1}}, function (err, echoData) {
    if (err || !echoData) {
        console.log("No messages found -sm",err);
    } else {
        echoData.forEach(function (returnData) {
            console.log(returnData);
        });
    }
});

给我错误:

{ [MongoError: Can't canonicalize query: BadValue Unsupported projection option: sort: { $natural: -1 }]
  name: 'MongoError',
  message: 'Can\'t canonicalize query: BadValue Unsupported projection option: sort: { $natural: -1 }',
  '$err': 'Can\'t canonicalize query: BadValue Unsupported projection option: sort: { $natural: -1 }',
  code: 17287 }



我不知道如何修复它。它适用于我的旧服务器,但不适用于最新 mongodb 和 mongojs 的新服务器。谁能帮帮我?

我认为这与 MongoJS 中的一项更改有关,该更改用于将投影选项传递给底层 cursos,但现在不再有效,但我无法确定确切的版本更改。

现在,您的两个块在 MongoDB API 方面无效,因此,它们在 MongoJS API 上也无效,至少在每个的当前版本。

在第一个块中,您应该将查询更改为以下内容:

collect.findOne({$query: {$or: [{from_id: enviou, to_id: viu}, {from_id: viu, to_id: enviou}]}, $orderby: {$natural: -1}}, function (err, echoData) {
    ...
});

第二个块比较棘手,因为您只能通过链接将这些指令直接传递给游标:

collect.find({$or: [{from_id: de, to_id: para}, {from_id: para, to_id: de}]}).skip(skipCount).limit(useDbLimit).sort({time: 1}, function (err, echoData) {
    ...
});

那些是 MongoJS/MongoDB 3.0 API 兼容的调用。