Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么mongodb ObjectId字段获取ObjectId的值(“000000000000000000000000000000”)?_Mongodb_Mongodb .net Driver - Fatal编程技术网

为什么mongodb ObjectId字段获取ObjectId的值(“000000000000000000000000000000”)?

为什么mongodb ObjectId字段获取ObjectId的值(“000000000000000000000000000000”)?,mongodb,mongodb-.net-driver,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("234

我在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字段,因为我从未在客户构造函数中设置过它。

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

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

我还需要在地址字段上创建一个索引,如果我有大量adr=ObjectId(“000000000000000000000000000000”)的客户,这不会产生任何问题吗

更新代码:

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();
}
我如何解决这个问题


谢谢

您确实没有发布足够的代码供任何人专门回答您的问题。当表示不是实际问题所在的位置时,伪代码和骨架可能很好,但在本例中,您显然有导致问题的回写内容,而您没有显示它

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

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

即使在关系世界中,一个真实的例子是订单上的客户地址。在订单上引用地址id是没有意义的,因为人们一直在更改地址。而且为某人保留一个旧地址的地址记录也太过分了。虽然我看到过其他的做法(还有很多),但最好的做法是将地址信息存储在文档中


他们网站上的MongoDB文档有一些非常好的阅读材料。我建议你花点时间好好看看。有价值的东西:)

我找到了解决办法!添加BsonIgnore解决了我的问题。
感谢大家的宝贵意见

啊,你的模型错了。它们不是mongodb中的外键。请编辑您的帖子并包含更多代码。问题可能出在你所掩盖的东西上。预先警告一下,这个问题的答案会告诉你你做错了,你应该嵌入我认为要共享(或检查)的相关代码就是你创建客户文档的地方。您应该将
adr
字段设置为
null
,并在创建地址时将其添加到客户文档中。通常,当您创建
BsonDocument
时;在您的情况下,似乎始终设置了地址引用。伪零objectid不应引起索引问题,但它们可能会使您的应用程序逻辑复杂化,因为您有一个无效数据的特殊情况。请尝试添加属性
[BsonIgnoreIfNull]
转到客户类别上的
adr
字段。这完全取决于软件的用途以及地址是否应单独存储。最初的问题提到了数据存储方式和技术实现方面的知识。@WiredPairie抱歉,伙计,我知道你已经建立了一个代表,我确实喜欢你的很多答案,但作为一般建模方法,这种方法很糟糕,需要告诉人们。我说,我在relational中看到了这一点,并且($work为我的利益很高兴地修复了它),也就是说,我希望促进未来的努力,使之比我以前遇到的做得更好。这适用于RavenDB,但同样适用于MondoDB IMO。