Mongoose:如何查找字段与ObjectId或字符串匹配的文档?

时间:2015-10-22 18:03:56

标签: node.js mongodb mongoose

这是NodeJs中的mongoose DataModel

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

但是在DB中,此字段在文档中具有多种类型的值,具有StringObjectId

我在mongoose中查询这个

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

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

是否有任何方法可以获取具有StringObjectId两种值的所有文档?

非常感谢帮助。感谢

2 个答案:

答案 0 :(得分:3)

Mongoose中有一个模式,因此当您查询文档时,它将按此模式类型进行搜索。如果您将模型的产品类型更改为" string",它将仅获取包含字符串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: ""}})
    }
)

答案 1 :(得分:1)

还有另一种方法可以做到这一点。如果我们将type更新为Mixed,那么它将获取每种类型的所有文档,StringObjectId

在架构中定义

mongoose.Schema.Types.Mixed

喜欢

product: {type: mongoose.Schema.Types.Mixed, required: true}