12

我在 mongo 中有这个项目:

[ { title: 'Product Name',
_id: 5052843e023273693300013c,
description: 'This is a fake description',
categories: [ 5052843e023273693300010a ],
} ]

我想找到具有此类别的此类产品。我努力了:

Product.find({ categories:  mongoose.Types.ObjectId('5052843e023273693300010a')})
Product.find({ categories:  mongoose.mongo.BSONPure.ObjectID.fromString('5052843e023273693300010a')})
Product.find({ categories:  '5052843e023273693300010a'})
Product.find({ 'categories':  '5052843e023273693300010a'})
Product.find({ categories:  {$in: ['5052843e023273693300010a']}})
Product.find({ categories:  Schema.Types.ObjectId('5052843e023273693300010a')})

但没有任何效果。我可以使用 _id: '5052843e023273693300013c' 按 id 获取。

请注意,当插入产品时,类别 ID 被添加为字符串(这意味着我只是分配了 ID 而不是类别对象,但这并不能解释为什么上述方法都不起作用 - 它在转储中未引用,因此 Mongo 可能识别为对象 ID。

关于 SO 的类似问题没有得到答案。

我正在使用最新的 Mongoose(3 个东西)和最近的 Mongo,Node。

更新:

我可以使用以下命令从 CLI 中很好地获取:

db.products.find({ categories: '5052843e02327369330000fe' }); 

有趣的是,我可以通过在我的代码中执行不相等来获取它 - 嗯?:

Product.find({ categories: { $ne: '5052843e02327369330000fe' }})

我的架构如下:

    var Product = new Schema({
        title: { type: String, required: true },
        slug: { type: String },
        summary: { type: String }, //browser title
        description: { type: String, required: false },
        excerpt: { type: String },    //for list and also for meta description
        publish: { type: Boolean },
        featured: { type: Boolean },
        unavailable: { type: Boolean },
        model: { type: String },
        google: { type: String },
        tags: { type: Array },
        categories:  [{ type: Schema.Types.ObjectId, ref: 'Category' }],
        manufacturer: { type: String },
        variations: { type: Array },
        prices: { type: Array },
        images: { type: Array },
        specs: { type: Array },
        modified: { type: Date, default: Date.now }

    });

    var Category = new Schema({
        title: { type: String, required: true },
        description: { type: String },
        parent: { type: Schema.Types.ObjectId, ref: 'Category' },
        images: { type: Array }
    });

谢谢

4

2 回答 2

12

在某些情况下,使用 Mongoose,您必须强制将字符串转换为 ID。通常它会自动为您执行此操作,但在您的特定情况下,它不会。以下代码片段将获取包含传递的 ID 的所有连接。

var mongoose = require('mongoose');
Node.find({ connections: mongoose.Types.ObjectId("535c5c1b8aa6dc5f021e8a98") }, function (err, results) { 
    console.log(results); 
});
于 2014-04-28T20:51:07.257 回答
0

发生的事情是,Mongoose 正在将您在调用中使用的任何值转换为 ObjectId 的值,因为这categories就是模式中定义的方式。但是您尝试匹配的文档值具有字符串类型而不是 ObjectId,因此它不匹配。Product.findcategoriescategories

要让事情再次正常工作,您需要清理现有文档以匹配您定义的架构。

于 2012-09-16T23:26:45.157 回答