2016-10-27 2 views
0

У меня есть коллекция Mongo, состоящая из документа и вложенного объекта, описывающего, какие коллекции находится в документе и когда он был добавлен. Я хотел бы удалить пары ключ-значение из вложенного объекта на основе условия, например. это значение (дата) до 1-1-2016.Mongo удалить из вложенного объекта по значению

Пример:

{ 
    "_id" : ObjectId("581214940911ad3de98002db"), 
    "collections" : { 
     "c01" : ISODate("2016-10-27T15:52:04.512Z"), 
     "c02" : ISODate("2015-11-21T16:06:06.546Z") 
    } 
} 

потребности стать

{ 
    "_id" : ObjectId("581214940911ad3de98002db"), 
    "collections" : { 
     "c01" : ISODate("2016-10-27T15:52:04.512Z"), 
    } 
} 

Одним из вариантов было бы изменить схему, чтобы что-то вроде этого:

{ 
    "_id" : ObjectId("581214940911ad3de98002db"), 
    "collections" : [ 
     { 
      "id": "c01", 
      "date": ISODate("2016-10-27T15:52:04.512Z") 
     }, 
     { 
      "id": "c02", 
      "date" : ISODate("2015-11-21T16:06:06.546Z") 
     } 
    ] 
} 

в этом случае удаление документа из a будет легко. Я немного неохотно это делаю, потому что это усложнит некоторые другие запросы, которые я хотел бы поддержать. Благодаря!

+0

вы будете делать себе большую пользу, если изменить схему. – styvane

ответ

0

Я предпочитаю вторую структуру для вашей схемы

{ 
    "_id" : ObjectId("581214940911ad3de98002db"), 
    "collections" : [ 
     { 
      "id": "c01", 
      "date": ISODate("2016-10-27T15:52:04.512Z") 
     }, 
     { 
      "id": "c02", 
      "date" : ISODate("2015-11-21T16:06:06.546Z") 
     } 
    ] 
} 

затем смог удалить из collections как этот

db.collectionName.update(
    { },// if you want can add query for specific Id {"_id" : requestId}, 
    { $pull: { collections: { date: {$lt: yourDate} } } }, // if need can convert iso date string like: new Date(yourDate).toISOString() 
    { multi: true } 
) 
Смежные вопросы