2015-12-29 7 views
0

Ниже приведена схема для контактов массива. Массив контактов имеет поле hashtag, которое является другим массивом. Как удалить элемент openLove из массива Hashtags?Удалить элемент из массива массива в MongoDb

"contacts" : [ 
    { 
     "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
     "personEmailId" : "[email protected]", 
     "_id" : ObjectId("565eb481bf35eeb83d7f9f13"), 
     "verified" : true, 
     "favorite" : true, 
     "linkedinUserName" : null, 
     "facebookUserName" : null, 
     "twitterUserName" : "IamlifePaul", 
     "count" : 2, 
     "relationshipStrength_updated" : 0, 
     "contactRelation" : { 
      "decisionmaker_influencer" : null, 
      "prospect_customer" : "prospect" 
     }, 
     "source" : "abc", 
     "mobileNumber" : "3546789", 
     "skypeId" : "123", 
     "designation" : "test", 
     "companyName" : "Something", 
     "location" : "Hyderabad, Telangana, India", 
     "personName" : "Naveen Paul", 
     "personId" : "565022d7dbeaeb9e17fc7083", 
     "hashtag" : [ 

      "latestTag", 
      "anotherTag", 
      "#hash", 
      "openLove", 
      "hellTwo", 
      "working?", 
      "hello", 
      "lol", 
      "zxc" 
     ], 
     "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
    }, 
{ 
     "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
     "personEmailId" : "[email protected]", 
     "_id" : ObjectId("565eb481bf35eeb83d7f9f13"), 
     "verified" : true, 
     "favorite" : true, 
     "linkedinUserName" : null, 
     "facebookUserName" : null, 
     "twitterUserName" : "IamlifePaul", 
     "count" : 2, 
     "relationshipStrength_updated" : 0, 
     "contactRelation" : { 
      "decisionmaker_influencer" : null, 
      "prospect_customer" : "prospect" 
     }, 
     "source" : "abc", 
     "mobileNumber" : "3546789", 
     "skypeId" : "123", 
     "designation" : "test", 
     "companyName" : "Something", 
     "location" : "Hyderabad, Telangana, India", 
     "personName" : "Naveen Paul", 
     "personId" : "565022d7dbeaeb9e17fc7083", 
     "hashtag" : [ 

      "latestTag", 
      "anotherTag", 
      "#hash", 
      "openLove", 
      "hellTwo", 
      "working?", 
      "hello", 
      "lol", 
      "zxc" 
     ], 
     "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
    }, 
{ 
     "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
     "personEmailId" : "[email protected]", 
     "_id" : ObjectId("565eb481bf35eeb83d7f9f13"), 
     "verified" : true, 
     "favorite" : true, 
     "linkedinUserName" : null, 
     "facebookUserName" : null, 
     "twitterUserName" : "IamlifePaul", 
     "count" : 2, 
     "relationshipStrength_updated" : 0, 
     "contactRelation" : { 
      "decisionmaker_influencer" : null, 
      "prospect_customer" : "prospect" 
     }, 
     "source" : "abc", 
     "mobileNumber" : "3546789", 
     "skypeId" : "123", 
     "designation" : "test", 
     "companyName" : "Something", 
     "location" : "Hyderabad, Telangana, India", 
     "personName" : "Naveen Paul", 
     "personId" : "565022d7dbeaeb9e17fc7083", 
     "hashtag" : [ 

      "polly", 
      "tagger", 
      "#hash", 
      "working?", 
      "hello", 
      "lol", 
      "zxc" 
     ], 
     "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
    } 

Как удалить элемент из массива Hashtags? например удалить openLove?

+0

Возможный дубликат [Как удалить элемент из двукратно вложенного массива в документе MongoDB] (http://stackoverflow.com/questions/5228210/how-to-remove-an-element-from -a-дважды вложенный-массив-в-MongoDB-документ) – thegreenogre

ответ

1

Вы обычно делаете это с помощью positional operator $ следующим образом:

db.collection.update(
    { "contacts.hashtag": "openLove" }, 
    { 
     "$pull": { 
      "contacts.$.hashtag": "openLove" 
     } 
    } 
) 

Однако, поскольку это поддерживает только один на уровне глубоких массивов (позиционные $ operator выступает в качестве заполнителя для первого элемента, соответствует документу запроса), удаляется только первый элемент, соответствующий документу запроса. Существует JIRA отслеживаются для этого здесь: https://jira.mongodb.org/browse/SERVER-831

Если вы знаете, индекс массива Hashtags, который имеет elememt быть удалены заранее, то запрос на обновление будет:

db.collection.update(
    { "contacts.hashtag": "openLove" }, 
    { 
     "$pull": { 
      "contacts.0.hashtag": "openLove", 
      "contacts.1.hashtag": "openLove" 
     } 
    } 
) 

Рассмотрим перепроектирования вашу схему, избегайте вложенных массивов, чтобы вы могли нормализовать свою коллекцию, создав отдельную коллекцию контактов, где каждый документ представляет собой контакт, с информацией, общей для набора контактов, дублированных в исходной коллекции. Что-то вроде следующего:

Коллекция схем:

{ 
    _id: collection_id, 
    contacts: [ 
     ObjectId("565eb481bf35eeb83d7f9f13"), 
     ObjectId("565eb481bf35eeb83d7f9f14"), 
     ObjectId("565eb481bf35eeb83d7f9f15") 
    ] 
} 

контакты схема:

{ 
    "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
    "personEmailId" : "[email protected]", 
    "_id" : ObjectId("565eb481bf35eeb83d7f9f13"), 
    ... 
    "hashtag" : [ 
     "latestTag", 
     "anotherTag", 
     "#hash", 
     "openLove", 
     "hellTwo", 
     "working?", 
     "hello", 
     "lol", 
     "zxc" 
    ], 
    "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
}, 
{ 
    "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
    "personEmailId" : "[email protected]", 
    "_id" : ObjectId("565eb481bf35eeb83d7f9f14"), 
    ... 
    "hashtag" : [ 
     "latestTag", 
     "anotherTag", 
     "#hash", 
     "openLove", 
     "hellTwo", 
     "working?", 
     "hello", 
     "lol", 
     "zxc" 
    ], 
    "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
}, 
{ 
    "addedDate" : ISODate("2015-12-02T09:06:09.891Z"), 
    "personEmailId" : "[email protected]", 
    "_id" : ObjectId("565eb481bf35eeb83d7f9f15"), 
    ... 
    "hashtag" : [ 
     "polly", 
     "tagger", 
     "#hash", 
     "working?", 
     "hello", 
     "lol", 
     "zxc" 
    ], 
    "lastInteracted" : ISODate("2015-12-08T05:07:53.746Z") 
} 

Обновление коллекции контактов будет проще, просто запустите операцию

db.contacts.update(
    { "hashtag": "openLove" }, 
    { 
     "$pull": { "hashtag": "openLove" } 
    } 
) 

Если перепроектирование схемы выходит за пределы области видимости, вам понадобится механизм для динамического создания документа обновления, то есть создать объект «на лету» объекта . Рассмотрите возможность использования Map-Reduce, чтобы сгенерировать это, answer подробнее вся концепция операции.

0

С помощью chridam's ответ, я получил его для работы с использованием идентификатора объекта каждого контакта.

db.user.update(
{ "contacts._id": ObjectId("5680f392e623e8b2107e6465") }, 
{ 
    "$pull": { 
     "contacts.$.hashtag": "openLove" 
    } 
}) 
Смежные вопросы