这是 NodeJs 中的 Mongoose 数据模型
产品:{type:mongoose.Schema.Types.ObjectId,ref:'产品',必需:true}
但是在数据库中,该字段在文档中具有多种类型的值,有String
和ObjectId
我正在 Mongoose 中查询这个
{
$or: [
{
"product": "55c21eced3f8bf3f54a760cf"
}
,
{
"product": mongoose.Types.ObjectId("55c21eced3f8bf3f54a760cf")
}
]
}
但这只是获取将该字段存储为 ObjectId 的文档。
有什么方法可以获取具有 String
或 ObjectId
两种类型值的所有文档吗?
非常感谢您的帮助。谢谢
最佳答案
Mongoose 中有一个 schema,所以当你查询文档时,它会通过这个 schema 类型来搜索。如果将模型的产品类型更改为“字符串”,它将仅获取具有字符串 ID 的文档。
即使有办法获取 string
或 ObjectId
,这种不一致对我来说还是很糟糕。
我遇到了同样的问题,因此解决方案是通过运行脚本来更新所有文档来标准化它们。
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/