这是NodeJs中的mongoose DataModel
product: {type: mongoose.Schema.Types.ObjectId, ref: 'products', required: true}
但是在DB中,此字段在文档中具有多种类型的值,具有String
和ObjectId
我在mongoose中查询这个
{
$or: [
{
"product": "55c21eced3f8bf3f54a760cf"
}
,
{
"product": mongoose.Types.ObjectId("55c21eced3f8bf3f54a760cf")
}
]
}
但这只是获取将该字段存储为ObjectId的文档。
是否有任何方法可以获取具有String
或ObjectId
两种值的所有文档?
非常感谢帮助。感谢
答案 0 :(得分:3)
Mongoose中有一个模式,因此当您查询文档时,它将按此模式类型进行搜索。如果您将模型的产品类型更改为" string",它将仅获取包含字符串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: ""}})
}
)
答案 1 :(得分:1)
还有另一种方法可以做到这一点。如果我们将type
更新为Mixed
,那么它将获取每种类型的所有文档,String
或ObjectId
在架构中定义
mongoose.Schema.Types.Mixed
喜欢
product: {type: mongoose.Schema.Types.Mixed, required: true}