【问题标题】:Select from mongoDB using Mongoose Where ObjectId NOT EQUAL to a particular ID使用 Mongoose 从 mongoDB 中选择 Where ObjectId NOT EQUAL to a specific ID
【发布时间】:2015-08-13 16:30:38
【问题描述】:

请问在模型 ID 与给定 ID 不匹配的情况下,如何使用 mongoose 从 MongoDB 检索记录。该模型已正确设置。我对 Node.js、mongoDB、Mongoose 并不陌生。

我尝试使用 $ne:

var ID = ....

User.find({id: {$ne: ID}},
function(error, users) {
  console.log(users);
  callback(error, count);
});

我也尝试过使用 RegExp:

var regex = new RegExp('^((?!' + ID + ').)*$', "i");
User.find({id: regex},
function(error, users) {
  console.log(users);
  callback(error, users);
});

【问题讨论】:

  • 不应该是_id而不是id吗?
  • 您要查找的文档是什么样的? JohnnyHK 关于_id 的观点似乎是一个不错的选择,但是当我们看不到您要搜索的内容时,这很难提供帮助。
  • @JohnnyHK _id 的字符串等价在猫鼬模型中被公开为 id(虚拟字段)
  • @AaronDufour 搜索的内容并不重要。只是试图获取与动态传入的 ID(字符串)不匹配的所有记录(文档)
  • @czprobity 你不能查询像id这样的虚拟字段,这就是为什么它需要_id。但是使用$ne 是正确的,ID 可以是一个字符串,因为 Mongoose 会根据架构将其转换为ObjectId

标签: regex node.js mongodb mongoose objectid


【解决方案1】:

谢谢大家,我终于可以这样做了:

var id = .... (string type)
User.find({_id: {$ne: id}}, 
  function(error, users) {
    console.log(users);
    callback(error, users);
  }
);

字符串id在比较之前被隐式转换为ObjectId。这样做的缺点是当字符串id 不是ObjectId 的字符串表示时,会抛出CastError。演员表会失败。

【讨论】:

    【解决方案2】:

    正如 JohnnyHK 和 Aaron Dufour 所说,您需要使用 _id 而不是 id

    此外,当您通过 _id 查询时,Mongo 期待的是一个对象而不是字符串。

    您可以要求本机 mongodb 驱动程序 ObjectID 并在您的代码中使用它,如下所示:

    var ObjectID = require('mongodb').ObjectID;
    
    _id = new ObjectID('stringId');
    
    User.find({'_id': {$ne: _id}},
    function(error, users) {
      console.log(users);
      callback(error, count);
    });
    

    See this answer.

    【讨论】:

    • 是的,这就是为什么我通过id 而不是_id 查询。我也试过这个方法,但没有奏效。当 new ObjectId 的参数不是 24 字节十六进制字符串、12 字节二进制字符串或指定的数字时,它会抛出异常 here
    • 这对我也不起作用,但@czprobity 的解决方案有效。由于某种原因,$ne 仅适用于字符串 ID 而不是对象 ID。
    猜你喜欢
    • 2022-12-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2021-04-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多