为什么mongodb ObjectId字段的值为ObjectId(“000000000000000000000000”)?

时间:2014-02-02 07:31:29

标签: mongodb mongodb-.net-driver

我在mongodb中收集了这样的内容:

Customers: 
{ "_id" : ObjectId("52e9...55"), "Adr" : ObjectId("52d5e53a0d4aff04a8a36c34") .. }
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("23423...5675") }
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("34545...7677") ..}

创建后,我不希望在客户文档中看到Adr字段,因为我从未在Customer构造函数中设置它。

如您所见,Adr字段存储来自Adresses集合的Address doc的ObjectId。 如果我需要查找给定文档的地址详细信息,我可以使用adrfield,获取id然后查询地址集合。

这是我的问题(或担忧): 添加新客户时,它没有地址。地址稍后添加。 我希望adrfield在创建新客户时为null或为空。 但我得到ObjectId(“000000000000000000000000”)而不是

我还需要在地址字段上创建索引,如果我有大量客户使用adr = ObjectId(“000000000000000000000000”),它是否会产生任何问题?

更新后的代码:

public class Customer
    {
        //code removed for simplicity

        public Customer()
        {
            Id = ObjectId.GenerateNewId();            

            //both of these works
            Name = null;
            Phone = string.Empty;

            //Doesn't work & creates Adr field w/  ObjectId("000..000") instead of null
            //cannot convert null to MongoDb.Bson.ObjectId because it is non-nullable value type
            //Adr = null;
        }

        [BsonId]
        public ObjectId Id { get; set; }

        [BsonElement("Name")]
        public string Name { get; set; }

        [BsonElement("Phone")]
        public string Phone { get; set; }

        //I added BsonIgnoreIfNull & didn't assign anything to Adr field in the constructor
        //But I keep getting a value of ObjectId("000000000000000000000000") in the Adr field
        [BsonElement("Adr"), BsonIgnoreIfNull]
        public ObjectId Adr{ get; set; }    
}

public class Address
{
    public Address()
        {
            Id = ObjectId.GenerateNewId();            

            Street = null;
            City = null;
            State = null;
            Country = null;
        }

        //STORED IN THE ADR FIELD OF THE Customers collection above
        //DUE TO SOME SPECIFIC REASON I NEED SEPARATE COLLECTION FOR ADDRESS not embedding
        [BsonId]
        public ObjectId Id { get; set; }

        [BsonElement("Street")]
        public string Street {get; set;}

        [BsonElement("City")]
        public string City {get; set;}

        [BsonElement("State"), BsonIgnoreIfNull]
        public string State {get; set;}


        [BsonElement("Country")]
        public string Country {get; set;}    
}


Here is my MVC controller where I insert a new customer:
[HttpPost]
public ActionResult AddCustomer(string Name, string Phone){

   //code removed for simplicity

   Customer cust = new Customer();
   cust.Name = name;
   cust.Phone = phone;

   CustomerService svc = new CustomerService();
   svc.InsertCustomer(cust);

   return Result();
}

如何解决此问题?

由于

2 个答案:

答案 0 :(得分:0)

您确实没有发布足够的代码供任何人专门回答您的问题。当代表不是实际问题的地方时,伪代码和骷髅可能会很好,但是在这种情况下,你显然有一些写回来导致问题并且你没有显示它。

那说你在这里要做的几乎肯定是你不想要的。您似乎试图遵循一种关系模式,说“我在这个其他集合中有一堆地址信息,我只想在本文档中保留对我想要的那个的引用。”

现在在某些情况下可能会很好,但地址信息似乎微不足道,应该真正嵌入主文档中作为子文档。所以你很可能会考虑嵌入并开始失去你的关系思路。

即使在关系世界中,一个真实案例就是订单上的客户地址。由于人们一直在更改地址,因此在订单上引用地址的ID是没有意义的。保留一些旧地址的地址记录是过度的。虽然我已经看到它已经完成(并且有很多),但最佳做法是将地址信息存储在文档中。

他们网站上的MongoDB文档在Data Modelling上有一些非常好的阅读。我建议你花点时间仔细看看。值得的东西:)

答案 1 :(得分:0)

我找到了解决方案!添加BsonIgnore解决了我的问题。 谢谢大家为您提供宝贵的意见