node.js - Mongoose : How to find documents in which fields match an ObjectId or a string?

标签 node.js mongodb mongoose

这是 NodeJs 中的 Mongoose 数据模型

产品:{type:mongoose.Schema.Types.ObjectId,ref:'产品',必需:true}

但是在数据库中,该字段在文档中具有多种类型的值,有StringObjectId

我正在 Mongoose 中查询这个

{
    $or: [
        {
            "product": "55c21eced3f8bf3f54a760cf" 
        }
        ,
        {
            "product": mongoose.Types.ObjectId("55c21eced3f8bf3f54a760cf") 
        }
    ]
}

但这只是获取将该字段存储为 ObjectId 的文档。

有什么方法可以获取具有 StringObjectId 两种类型值的所有文档吗?

非常感谢您的帮助。谢谢

最佳答案

Mongoose 中有一个 schema,所以当你查询文档时,它会通过这个 schema 类型来搜索。如果将模型的产品类型更改为“字符串”,它将仅获取具有字符串 ID 的文档。

即使有办法获取 stringObjectId,这种不一致对我来说还是很糟糕。

我遇到了同样的问题,因此解决方案是通过运行脚本来更新所有文档来标准化它们。

db.products.find().forEach(function(product) {
  db.products.update({ type: product.type},{
      $set:{ type: ObjectId(data.type)}
  });
});

我看到的唯一问题是这个 type 字段实际上是一个 _id 字段。 MongoDB 中的 _id 字段是不可变的并且无法更新。如果是这种情况,您只需创建一个具有相同(但已解析)id 的新文档并删除旧文档即可。

这就是我所做的:(在 Robomongo 中)

db.getCollection('products').find().forEach(
    function(doc){
        var newDoc = doc;
        newDoc._id = ObjectId(doc._id);

        db.getCollection('products').insert(newDoc);
    }
)

然后删除所有文档,其中id是一个字符串:

db.getCollection('products').find().forEach(
    function(doc){
        db.getCollection('products').remove({_id: {$regex: ""}})
    }
)

关于node.js - Mongoose : How to find documents in which fields match an ObjectId or a string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33287665/

相关文章:

node.js - 更新引用以及其他值 Mongoose

node.js - 我可以使用 ajv json 模式验证日期,而不将日期转换为字符串吗?

javascript - 基于先前调用的响应的异步调用,避免回调 hell

javascript - module.require(...).* 是否返回 module.exports.* 的副本或它的引用?

node.js - mongodb 和 Node js 中堆内存不足

java - 使用 Reactive MongoDB 模板返回 Mono<UpdateResult>

node.js - Nodejs | Mongoose - 根据多个不同字段查找文档

javascript - Nodejs 变量声明

javascript - NodeJS promise : Do I have a race condition problem?

node.js - 为 Mongoose 中的对象数组设置默认值