Mongoose / Mongo在objectIds数组中找到

时间:2012-09-16 22:44:16

标签: mongodb mongoose nodes

我在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获取id:_id:'5052843e023273693300013c'。

请注意,当插入产品时,类别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 }
    });

由于

2 个答案:

答案 0 :(得分:9)

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

var mongoose = require('mongoose');
Node.find({ connections: mongoose.Types.ObjectId("535c5c1b8aa6dc5f021e8a98") }, function (err, results) { 
    console.log(results); 
});

答案 1 :(得分:1)

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

为了让事情再次发挥作用,您需要清理现有文档以匹配您定义的架构。