提问者:小点点

是否从嵌入文档中删除最近的对象?


我正在使用mongoose和node js进行开发。 我想要从嵌入式文档$pull最近的对象spas

这是我的样本数据。 请帮我构建mongodb查询。

{
    "_id" : ObjectId("5f071322c89b0e2a7c35a25a"),
    "totalPrice" : 0,
    "user" : ObjectId("5ee096ee7febd3408828ce2c"),
    "type" : "SpaService",
    "spas" : [
        {
            "price" : 0,
            "_id" : ObjectId("5f071322c89b0e2a7c35a25b"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 60
        },
        {
            "price" : 0,
            "_id" : ObjectId("5f071328c89b0e2a7c35a25c"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 60
        },
        {
            "price" : 0,
            "_id" : ObjectId("5f071363c89b0e2a7c35a25d"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 30
        }
    ],
    "listingId" : ObjectId("5ebbf95fb117f50dac1039d1")
}

在本例中,我在spas中有3个object,我希望拉取最近的_id,其duration为60。 请帮帮我。


共1个答案

匿名用户

db.test.aggregate([
  {
    "$match": {
      "spas.duration": 60
    }
  },
  {$project: {
        spas: {$filter: {
            input: '$spas',
            as: 'spas',
            cond: {$eq: ['$$spas.duration', 60]}
        }}   
   }},
   {$unwind: {path: "$spas"}},
   {$sort: {"spas._id": -1}},
   {$group: {_id: "$_id", data: {$first: "$$ROOT"}}},
])
  

它返回

/* 1 */
{
    "_id" : ObjectId("5f071322c89b0e2a7c35a25a"),
    "data" : {
        "_id" : ObjectId("5f071322c89b0e2a7c35a25a"),
        "spas" : {
            "price" : 0,
            "_id" : ObjectId("5f071328c89b0e2a7c35a25c"),
            "categoryId" : ObjectId("5ebbfd29b117f50dac1039e2"),
            "serviceId" : ObjectId("5ebbfd29b117f50dac1039e3"),
            "duration" : 60
        }
    }
}
  

它在做什么:

  1. 匹配仅获得60
  2. 仅使用筛选器进行项目以获取数组输出中持续时间为60的元素
  3. 展开以具有单独的spas元素
  4. 按SPAS_ID排序
  5. 再次分组并获取第一个元素