首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb ObjectId字段为什么获得ObjectId值(“000000000000000000000000”)?

mongodb ObjectId字段为什么获得ObjectId值(“000000000000000000000000”)?
EN

Stack Overflow用户
提问于 2014-02-02 07:31:28
回答 2查看 3K关注 0票数 1

我在mongodb中收藏了如下所示:

代码语言:javascript
复制
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字段。

如您所见,Adr字段存储地址文档的ObjectId。如果需要查找给定文档的地址细节,可以使用adrfield,获取id,然后查询address集合。

这是我的问题(或关注):当添加一个新客户时,它没有地址。稍后添加地址。创建新客户时,我希望adrfield为空或空。但是我得到了ObjectId(“0000000000000000000000”)

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

更新代码:

代码语言:javascript
复制
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();
}

我如何解决这个问题?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-02-02 08:39:55

你真的没有发布足够的代码让任何人专门回答你的问题。如果表示不是实际问题所在,那么伪代码和骨架可能是很好的,但是在这种情况下,很明显,您有一些东西正在回写导致问题,而您并没有显示它。

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

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

即使在关系世界中,一个真实的例子就是客户对订单的依赖。当人们一直在更改地址时,引用一个地址的id是没有意义的。为某个人的旧地址保留一个地址记录太过分了。尽管我已经看到了它,但最好的做法是将地址信息存储在文档中。

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-02 18:42:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21508154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档