MongoDB: les ID générés automatiquement sont des zéros

J'utilise MongoDB et Official c # driver 0.9

je suis juste en train de vérifier comment l'intégration de documents simples fonctionne.

Il y a 2 classes aisées:

public class User
{
    public ObjectId _id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Address> Addresses { get;set; }
}

public class Address
{
    public ObjectId _id { get; set; }
    public string Street { get; set; }
    public string House { get; set; }
}

je crée un nouvel utilisateur:

var user = new User
{
    Name = "Sam",
    Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};

collection.Insert(user.ToBsonDocument());

L'utilisateur est enregistrée avec succès, son adresse.

Après avoir tapé

db.users.find()

dans MongoDB shell, j'ai obtenu le résultat suivant:

{ "_id" : ObjectId("4e572f2a3a6c471d3868b81d"), "Name" : "Sam",  "Addresses" : [
        {
                "_id" : ObjectId("000000000000000000000000"),
                "Street" : "BIGSTREET",
                "House" : "BIGHOUSE"
        }
] }

pourquoi adresse ' object id 0?

faire des requêtes avec le adresse fonctionne bien:

collection.FindOne(Query.EQ("Addresses.Street", streetName));

il renvoie L'utilisateur "Sam".

18
demandé sur Alex 2011-01-04 16:45:01

3 réponses

utiliser L'attribut BsonId:

public class Address
{
    [BsonId]
    public string _id { get; set; }
    public string Street { get; set; }
    public string House { get; set; }
}

Identification du champ D'identification ou de la propriété

Pour identifier le champ ou la propriété de une classe est l'Id que vous pouvez écrire:

public class MyClass {
    [BsonId]
    public string SomeProperty { get; set; }
}

Tutorial Driver

Modifier

C'est pas vraiment de travail. Je vérifierai plus tard pourquoi. Si vous avez besoin d'obtenir le travail suivant:

    [Test]
   public void Test()
    {
        var collection = Read.Database.GetCollection("test");

        var user = new User
        {
            Name = "Sam",
            Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET", _id = ObjectId.GenerateNewId().ToString() } })
        };

        collection.Insert(user.ToBsonDocument());
    }
11
répondu Andrew Orsich 2011-01-04 14:09:49

ce n'est pas tant un bug qu'un cas d'attentes non satisfaites. Seul le niveau supérieur _id reçoit automatiquement une valeur. Toutes les valeurs _ids intégrées doivent être attribuées par le code client (utilisez ObjectId.GenerateNewId). Il est également possible que vous n'ayez même pas besoin d'un ObjectId dans la classe Address (quel en est le but?).

24
répondu Robert Stam 2011-01-04 14:56:25

Obtenir la collection en tant que type d'Utilisateur:

var collection = db.GetCollection<User>("users");

Initialiser le champ _id comme suit:

var user = new User
{
   _id = ObjectId.Empty,
   Name = "Sam",
   Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};

ensuite vous insérez l'objet:

collection.InsertOne(user);

Le champ _id sera automatiquement généré.

Dans ce lien vous trouverez d'autres façons d'avoir des ID personnalisés générés automatiquement.

2
répondu Ibrahim 2017-03-29 19:52:30