Mongo按值从嵌套对象中删除

时间:2016-10-27 15:19:26

标签: mongodb mongodb-query

我有一个Mongo集合,它由一个文档和一个嵌套对象组成,描述了文档所处的集合以及添加的时间。我想根据条件从嵌套对象中删除键值对,例如是1-1-2016之前的值(日期)。

示例:

{
    "_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中删除文档很容易。我有点不愿意这样做,因为它会使我想支持的其他一些查询复杂化。谢谢!

1 个答案:

答案 0 :(得分:1)

我更喜欢你的架构的第二个结构

{
    "_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 }
)