2013-01-14 8 views
20

J'ai inséré document s dans MongoDB sans id. Et je veux les récupérer en recherchant par leur MongoDB ObjectId, qui a été affecté par défaut.Requête MongoDB en utilisant 'ObjectId'

Voici mon attempt-

var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153"); 
var entity = dbCollection.FindOne(query_id); 
return entity.ToString(); 

et je reçois error- suivant

Une première chance exception du type 'System.NullReferenceException' a eu lieu

Quel est le problème ?

Répondre

44

Vous devez créer une instance de ObjectId, puis interroger à l'aide de cette instance, sinon votre requête compare ObjectId s à la chaîne et ne parvient pas à trouver les documents correspondants.

Cela devrait fonctionner:

var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153")); 
var entity = dbCollection.FindOne(query_id); 
return entity.ToString(); 
+3

Cette réponse est presque correcte. Au moins en C#, il semble qu'il n'y a plus de méthode FindOne(). Remplacez-le par FindOneAs() à la place. Voici un lien vers un bon exemple, celui-ci utilise FindAs(), mais c'est le même principe: http://stackoverflow.com/a/12345580/2705003 – kbpontius

+0

Il n'y a maintenant plus de méthode FineAs ou FindOneAs, la réponse de Minhas Kamal devrait être référé à la place –

1

La réponse choisie est correcte. Pour tout le monde confus par le Query.EQ, voici une autre façon d'écrire une mise à jour de base (met à jour l'ensemble du document MongoDB):

string mongoDocumentID = "123455666767778"; 
var query = new QueryDocument("_id", ObjectId.Parse(mongoDocumentID)); 
var update = new UpdateDocument { { "$set", documentToSave } }; 
mongoCollection.Update(query, update, UpdateFlags.Multi); 

L'objet ObjectId est nécessaire lorsque vous voulez rechercher effectivement par ID d'objet, sinon compare la chaîne au type objectid, et cela ne correspondra pas. Mongo est très strict dans ce sens, même si le nom du champ est correct.

14

Dans C# pour le dernier officiel MongoDB.Driver écrire this-

var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153")); 
var entity = dbCollection.Find(filter).FirstOrDefault(); 
return entity.ToString(); 

Nous pouvons obtenir le même résultat sans conversion id de chaîne à ObjectId. Mais alors, nous devrons ajouter [BsonRepresentation(BsonType.ObjectId)] avant l'attribut id dans la classe du modèle.

Le code peut même être encore simplifiée en utilisant expression lambda -

var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault(); 
return entity.ToString(); 
Questions connexes