La mangouste/Mongo trouver dans la gamme de objectIds
J'ai ce point de mongo:
[ { title: 'Product Name',
_id: 5052843e023273693300013c,
description: 'This is a fake description',
categories: [ 5052843e023273693300010a ],
} ]
Je veux trouver de tels produits qui ont cette catégorie. J'ai essayé:
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')})
Mais rien ne fonctionne. Je peux chercher par l'id de l'amende juste à l'aide de: _id: '5052843e023273693300013c'.
Noter que lorsque les produits ont été insérées à l'ID de la catégorie ont été ajoutés comme une chaîne (sens je viens attribué l'ID au lieu de la catégorie des objets, mais cela n'explique pas pourquoi aucun de ces travaux: c'est non cotées dans le cliché peut-être, Mongo reconnaît comme un ID de l'objet.
Des questions similaires sur n'a DONC pas d'obtenir une réponse.
Je suis en utilisant la dernière de la Mangouste (3) et les récentes Mongo,Nœud.
Mise à jour:
Je peux simplement aller chercher bien à partir de la CLI à l'aide de:
db.products.find({ categories: '5052843e02327369330000fe' });
et il est intéressant de noter que je peux le récupérer en faisant le pas de l'égalité dans mon code - hein?:
Product.find({ categories: { $ne: '5052843e02327369330000fe' }})
Mon schéma est comme suit:
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 }
});
Grâce
Product
modèle?Mise à jour de la question avec le schéma
OriginalL'auteur cyberwombat | 2012-09-16
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe, c'est que la Mangouste est coulée quelle que soit la valeur que vous utilisez pour un
categories
valeur dans votreProduct.find
appel à un ObjectId que c'est commecategories
est défini dans le schéma. Mais les du documentcategories
valeur que vous essayez de faire correspondre a un type de chaîne au lieu d'un ObjectId il n'est donc pas de mise en correspondance.Pour que cela fonctionne de nouveau, vous aurez besoin pour nettoyer vos documents existants pour correspondre à votre schéma défini.
J'ai pensé que c'est ce qui vous a été dit ici:
when the products were inserted the category ID were added as a string
. Si vous avez toujours eu le schéma en indiquant un tableau de ObjectIds et vous avez fait tout votre insère dans la Mangouste alors qu'ils doivent déjà être ObjectIds dans la collection.À partir de votre mise à jour, si
db.products.find({ categories: '5052843e02327369330000fe' });
renvoie votre document dans la CLI, puiscategories
contient une chaîne de caractères et non un ObjectId dans ce cas.Je suppose que ce que je demande est de savoir comment insérer ces ID à partir d'une forme comme un ID de l'objet, quand tout ce que j'ai est l'ID et non liées à l'objet (par exemple, des catégories d'être sélectionné à partir d'un menu déroulant dans le produit formulaire d'édition). C'est ce que je veux dire par inséré comme une chaîne de caractères. Ce que je viens de trouver maintenant est que, parfois, ma requête fonctionne ce qui semble indiquer une variation dans la façon dont les choses sont stockées tout simplement pas sûr de savoir comment garantir la bonne insertion. Je fais quelque chose comme var p = new Produit; p.catégories = req.params.catégories (un réseau poste de chat Id) puis p.enregistrer.
Réglage
p.categories
à un tableau de chaîne de représentations de ObjectIds et puis l'appel dep.save()
devrait fonctionner correctement. J'ai juste couru un test et les valeurs enregistrées danscategories
ont été ObjectIds, pas de chaînes.OriginalL'auteur JohnnyHK
Avec Mangouste vous avez à force de jeter votre chaîne comme un ID dans certains cas. Habituellement, il le fait automatiquement pour vous, mais dans votre cas particulier, il ne le fait pas. L'extrait de code suivant obtiendrez toutes les connexions avec l'ID passé.
Je commence à courir dans ce de plus en plus et j'ai du mal à cerner exactement quand il arrive et quand il n'est pas. Je ne suis pas sûr si je suis en cours d'exécution dans cette dans une Mangouste .mise à jour avec une requête avec { _id: { $à: [ ... ] } }. Quels sont les cas connus où il arrive. Quelqu'un sait pourquoi ça arrive?
OriginalL'auteur Ash Blue