gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:00:36 25 4
gpt4 key购买 nike

这是 NodeJs 中的 mongoose DataModel

产品:{type: mongoose.Schema.Types.ObjectId, ref: 'products', required: true}

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

我在 Mongoose 中查询这个

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

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

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

非常感谢您的帮助。谢谢

最佳答案

Mongoose 中有一个模式,所以当你查询一个文档时,它会根据这个模式类型进行搜索。如果将模型的产品类型更改为“字符串”,它将仅获取具有字符串 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com