mongodb 查询数组中某一项

本文展示了如何使用MongoDB查询特定任务数据以及更新任务状态。内容包括查询task_list中task_flow_id为2的数据,更新task_list中task_flow_id为1的任务状态,并提供了对应的Java代码实现。涉及MongoDB的查询与更新操作,以及Java对MongoDB的操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. mongo数据结构如下

{
    "_id": ObjectId("62625d6e418c6626322314e1"),
    "task_list": [
        {
            "task_flow_id": NumberInt("1"),
            "task_flow_name": "申报过程",
            "status": NumberInt("3"),
            "longterm": NumberInt("1"),
            "oper_id": "123",
            "oper_name": "张三",
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-24 10:08:19"
        },
        {
            "task_flow_id": NumberInt("2"),
            "task_flow_name": "申报评审过程",
            "status": NumberInt("2"),
            "longterm": NumberInt("1"),
            "oper_id": "123",
            "oper_name": "张三",
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-24 10:08:38"
        },
        {
            "task_flow_id": NumberInt("3"),
            "task_flow_name": "合同过程",
            "status": NumberInt("2"),
            "start_date": "2022-04-09 00:00:00",
            "end_date": "2022-05-10 00:00:00",
            "oper_id": "123",
            "oper_name": "张三",
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-24 10:17:50"
        },
        {
            "task_flow_id": NumberInt("4"),
            "task_flow_name": "成员变更过程",
            "status": NumberInt("2"),
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-24 10:36:34",
            "end_date": "",
            "longterm": NumberInt("1"),
            "oper_id": "123",
            "oper_name": "张三",
            "start_date": ""
        },
        {
            "task_flow_id": NumberInt("5"),
            "task_flow_name": "延期变更过程",
            "status": NumberInt("1"),
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-22 15:46:54"
        },
        {
            "task_flow_id": NumberInt("6"),
            "task_flow_name": "终止变更过程",
            "status": NumberInt("1"),
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-22 15:46:54"
        },
        {
            "task_flow_id": NumberInt("7"),
            "task_flow_name": "验收过程",
            "status": NumberInt("1"),
            "create_time": "2022-04-22 15:46:54",
            "update_time": "2022-04-22 15:46:54"
        }
    ],
    "create_time": "2022-04-22 15:46:54",
    "update_time": "2022-04-24 10:19:19",
    "name": "脑梗研究计划2",
    "plan_year": "2022"
}

2. 查询

查询task_list中task_flow_id为2d 数据

db.plan.find({ "_id": ObjectId("62621f42c2d824376d2bb35b"), "task_list.task_flow_id":2}, {"_id": 0, "task_list.$": 1});

3. 更新

更新tasklist中满足条件的状态

db.plan.update({
    "_id": ObjectId("62621f42c2d824376d2bb35b"),
    "task_list.task_flow_id": 1
}, {
    "$set": {"task_list.$.status": 2}
});

4. java代码

  • 获取task
public Task getTask(String planId, int flowTaskId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(planId));
        query.addCriteria(Criteria.where("task_list.task_flow_id").is(flowTaskId));

        query.fields().exclude("_id");
        query.fields().include("task_list.$");

        Plan plan = this.mongoTemplate.findOne(query, Plan.class, this.col);
        if (Objects.isNull(plan)) { return  null; }
        List<Task> taskList = plan.getTaskList();
        if (Objects.isNull(taskList) || taskList.size() < 1) { return  null; }

        return taskList.get(0);
}
  • 更新task
public void updateTask(String planId, Task task) {
      Query query = new Query();
      query.addCriteria(Criteria.where("_id").is(planId));
      query.addCriteria(Criteria.where("task_list.task_flow_id").is(task.getTaskFlowId()));

      Update update = new Update();
      update.set("task_list.$.status", task.getStatus());
      update.set("task_list.$.longterm", task.getLongterm());
      update.set("task_list.$.start_date", task.getStartDate());
      update.set("task_list.$.end_date", task.getEndDate());
      update.set("task_list.$.oper_id", task.getOperId());
      update.set("task_list.$.oper_name", task.getOperName());
      update.set("task_list.$.update_time", task.getUpdateTime());

      this.mongoTemplate.updateFirst(query, update, this.col);
}
### 如何在MongoDB中对数组字段进行排序 对于包含数组类型的文档,在执行查询时可能希望按照数组中的元素顺序进行排序。这通常涉及到两个不同的概念:一是按数组内元素的值对整个文档列表排序;二是调整单个文档内部数组元素自身的顺序。 当需要基于数组内的某些特定条件来筛选并排序文档时,可以利用`$unwind`操作符先拆分含有数组属性的对象成多条记录再做进一步处理[^2]。下面给出一个具体的实例用于说明如何实现这一点: 假设有一个名为`students`的数据集,其中每份文档代表一名学生的信息,并且每位学生的成绩被存储在一个叫做`scores`的数组。现在想要找到所有平均分数大于等于85的学生名单,并依据他们最高的那门课的成绩降序排列。 ```javascript db.students.aggregate([ { "$match": {"averageScore": {$gte: 85}} }, // 只考虑那些平均分达到标准的同学 { "$unwind": "$scores"}, // 将每个学生成绩表展开为单独项 { "$group": { "_id": "$_id", // 按照原始ID重新组合数据 "name": {"$first": "$name"}, "highestScore": {"$max": "$scores.value"} } }, { "$sort": {"highestScore":-1} } // 对最终结果根据最高得分排序(-1表示降序) ]) ``` 如果目标是在不改变原有结构的情况下仅修改某篇文档数组成员位置,则应该采用更新器方法而不是聚合管道。比如要使`tags`这个标签数组面的项目从小到大自动整理好,可以用如下方式完成: ```javascript // 假设我们有这样一个文档 { _id: ObjectId("..."), name: 'example', tags: ['z', 'b', 'a'] } // 更新它使得tags有序化 db.collection.updateOne( {_id:ObjectId("...")}, [{ $set :{ tags: { $function: { body: "function(tags){return tags.sort();}", args:[ "$tags" ], lang:"js"}} }}] ); ``` 需要注意的是上述第二种情况下的做法依赖于MongoDB版本支持JavaScript表达式的特性[$function](https://docs.mongodb.com/manual/reference/operator/aggregation/function/)来进行自定义函数调用,不是所有的部署环境都允许这样做。因此实际开发过程中应当谨慎评估适用性和安全性后再决定是否采纳此方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值