2011-04-23 73 views
2

使用mongodb我试图从其父集合(Listing)的子集合(ListingFeatures)中移除一个属性(_id)。换句话说,我有一个Listing对象,它里面有一个ListingFeature对象列表。 ListingFeature有一个_id属性,我试图删除它。从子集合中移除属性

这里是我试过的命令,我认为会的工作:

db.Listing.update({ "ListingFeatures._id": { $exists:true } }, { $unset: { "ListingFeatures._id": 1 } }, false, true); 

这跑了〜30分钟完成之前(上市有300万条记录),它并没有抛出任何错误或提供任何某种消息表示成功或失败,但是Listing.ListingFeatures._id属性仍然存在。

我缺少什么?

这里是一个精简的示例上市文件。最终,我想从ListingFeatures集合中删除_id,CreateDate和UpdateDate。

{ 
    "Address": "1080 DUNLAP ORPHANAGE RD", 
    "City": "Unincorporated", 
    "ListingFeatures": [ 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Status: ACTIVE" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "County: Tipton" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Approximately 10 acre(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "2 total full bath(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "2 total half bath(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "9 total rooms" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "2 stories" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Type: General Residential" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Master Bedroom is Carpet, Full Bath, Level 1, Walk-In Closet" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Basement is Partial, Unfinished" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Pool features: Above Ground" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "2 covered parking space(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Yes car garage(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Attached parking" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Cooling features: 220 Wiring, Dual System,Cooling" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Inclusions: Cooktop, Dishwasher, Gas Cooking, Microwave, Refrigerator, Satellite Dish, Self Cleaning Oven" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Lot features: Chain Fenced, Landscaped, Level, Some Trees, Wooded" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Lot size is between 10 and 20 acres" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Utilities present: Public Water, Septic Tank" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Swimming pool(s)" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Basement" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Den" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Laundry room" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Hardwood floors" 
    }, 
    { 
     "_id": null, 
     "CreateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "UpdateDate": "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
     "Name": "Parking features: Driveway/Pad, Garage Door Opener(s), Storage Room(s), Workshop(s)" 
    } 
    ], 
    "ZipCode": "38011", 
    "_id": { 
    "$oid": "4d99055b1b9ba917bcef9443" 
    } 
} 
+0

你是否还试过没有查询'{“ListingFeatures._id”:{$ exists:true}}'的查询?那样有用吗? – proximus 2011-04-24 08:50:15

+0

刚试过,_id属性仍然存在:db.Listing.update({},{$ unset:{“ListingFeatures._id”:1}},false,true); – Justin 2011-04-24 14:29:22

回答

0

只有一种方法,为我工作。 即使带小孩的孩子也能工作。

var updated_comment = 0; 
db.Document.find().forEach(function(doc){ 

    function remove_errors(comments){ 
     comments.forEach(function(comment){ 
      delete comment.errors 
      updated_comment = updated_comment + 1; 
      remove_errors(comment.comments); 
     }); 
    } 

    remove_errors(doc.comments); 

    db.Document.save(doc); 
}); 

print("done updated_comment = " + updated_comment); 
0

我敢肯定你不能删除_id(事实上,你甚至不能去除它的指数)。它由MongoDB保留字段并充当文档标识符。

编辑

你去 - 必须使用$ Position Operator

> db.stackoverflow.findOne() 
{ 
    "_id" : ObjectId("4db6362c9e631c2a52a7c645"), 
    "Address" : "1080 DUNLAP ORPHANAGE RD", 
    "City" : "Unincorporated", 
    "ListingFeatures" : [ 
     { 
      "someid" : "123", 
      "CreateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "UpdateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "Name" : "Approximately 10 acre(s)" 
     }, 
     { 
      "someid" : "456", 
      "CreateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "UpdateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "Name" : "2 total full bath(s)" 
     } 
    ], 
    "ZipCode" : "38011" 
} 

让我们删除CreateDate,其中someid在此集合中是“456”。

> db.stackoverflow.update({"ListingFeatures.someid":"456"},{$unset:{"ListingFeatures.$.CreateDate":1}});              

现在我们验证CreateDate已经从someid为“456”的元素中消失了。

> db.stackoverflow.findOne()                    
{ 
    "Address" : "1080 DUNLAP ORPHANAGE RD", 
    "City" : "Unincorporated", 
    "ListingFeatures" : [ 
     { 
      "someid" : "123", 
      "CreateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "UpdateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "Name" : "Approximately 10 acre(s)" 
     }, 
     { 
      "Name" : "2 total full bath(s)", 
      "UpdateDate" : "Sun, 03 Apr 2011 19:40:04 GMT -04:00", 
      "someid" : "456" 
     } 
    ], 
    "ZipCode" : "38011", 
    "_id" : ObjectId("4db6362c9e631c2a52a7c645") 
} 
+0

我试图从子集合中删除另一个属性来检查,并且该属性也没有被删除,所以它与_id无关。 – Justin 2011-04-25 03:05:15

+0

作为一个例子,你能粘贴这个集合的文档吗? – lobster1234 2011-04-25 03:25:46

+0

@ lobster1234 - 编辑原始问题添加示例文档。 – Justin 2011-04-25 13:08:57