当前位置: 首页 > 知识库问答 >
问题:

通过Morphia(MongoDB)推入嵌入子文档中的数组

连文栋
2023-03-14
@Entity("trackers")
public class Tracker {

    @Id
    private ObjectId id;
    private String ican;
    @Embedded
    private List<Day> days;

    //getters, setters & constructors
}
@Embedded
public class Day {

    private LocalDate date;
    @Embedded
    private List<GeoStamp> geoStamps;

    //getters, setters & constructors
}
@Embedded
public class GeoStamp {

    private Date dateTime;
    private double latitude;
    private double longitude;

    //getters, setters & constructors
}
{
    "_id" : ObjectId("58ee636b44e7ed48200ee8d4"),
    "className" : "com.model.Tracker",
    "ican" : "NL 12346",
    "days" : [
        {
            "date" : ISODate("2017-04-11T22:00:00Z"),
            "geoStamps" : [
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                },
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                },
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                }
            ]
        },
        {
            "date" : ISODate("2017-01-01T23:00:00Z"),
            "geoStamps" : [
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                },
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                },
                {
                    "dateTime" : ISODate("2017-04-12T17:27:07.249Z"),
                    "latitude" : 23.2222,
                    "longitude" : 44.333
                }
            ]
        }
    ]
}

现在我想做的是将一个GeoStamps列表推送到Mongo中的GeoStamphtml" target="_blank">数组,在那里我首先过滤跟踪器的ObjectId或它的iCAN。然后在文档中发现我需要按日过滤,所以我不会将GeoStamp列表添加到分布在多个日期的多个GeoStamp数组中。

我想可以用下面的方法来做:

我的查询(是的,我知道retrievedFields是不推荐的,我不想使用它,但这是我最接近工作的解决方案):

final Query<Tracker> trackerQuery = datastore.find(Tracker.class)
                .filter("_id", id)
                .filter("days.date", LocalDate.now())
                .retrievedFields(true, "days.$");
final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class).push("days.geoStamps", newGeoStamps);
final UpdateResults trackerUpdateResults = datastore.update(trackerQuery, trackerUpdate);

写入失败,错误代码为16837,错误消息“不能使用部分(days of days.geostamps)遍历元素({days:[{日期:新日期(1491948000000),地理戳:[{日期:新日期(1492019739661),纬度:23.2222,经度:44.333},{日期:新日期(1492019739661),纬度:44.333},{日期:新日期(1492019739661),纬度:23.2222,经度:44.333}]},{日期:新日期(1483311600000),地理戳:[{日期:新日期(1492019739661),纬度:23.2222,经度:44.333},地理戳:[{日期:新日期(1492019739661),纬度:44.333}时间:新日期(1492019739661),纬度:23.2222,经度:44.333},{datetime:新日期(1492019739661),纬度:23.2222,经度:44.333}]})‘

你在错误中看到的纬度和经度是我试图插入的。

关于如何实现这一点有什么想法吗?

共有1个答案

鲁熙云
2023-03-14

结果我实际上并没有推到一个数组,下面是:

final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class).push("days.geoStamps", newGeoStamps);

应该是:

final UpdateOperations<Tracker> trackerUpdate = datastore.createUpdateOperations(Tracker.class)
                .push("days.$.geoStamps", newGeoStamps);

希望这可能对将来的人有所帮助!

 类似资料:
  • 如果我有一个数据,其结构类似于集合中的单个文档: 有没有办法通过id“childid”搜索嵌入的文档?因为mongo没有索引嵌入文档的_id字段(如果我在这里错了,请纠正我),因为这个查询不起作用:db。收集查找({u id:“childid”}); 另外,请告知我是否有任何其他文档数据库适用于这种树结构的检索数据,其中要求: 查询子级而不必发出联接 查找树中的任何节点的速度与查找根节点的速度一样

  • 我正试图通过Morphia在mongodb中保存一个文档列表。 我想要的是,如果列表包含一个重复的测试实体,不要插入它,而是继续添加REST。 是否可以使用方法?

  • 问题内容: 我正在尝试将文档插入Node.js中的MongoDB中。我已经从数据库中成功读取了文件,并通过命令行界面添加了文档。但是,我无法从JavaScript插入文档。如果这样做,我会收到一个错误: 错误:没有提供的回调无法使用writeConcern 这是我的代码: 我无法终生弄清楚为什么会出现此错误。 我做错了什么,我应该怎么做呢? 问题答案: 您需要为调用提供回调函数,以便该方法可以将插

  • 主要内容:insert() 与 save() 方法,insertOne() 方法,insertMany() 方法前面我们已经介绍了如何在 MongoDB 中 创建数据库和 创建集合,接下来我们再来介绍一下如何在集合中插入文档。文档是 MongoDB 中数据的基本单位,由 BSON 格式(一种计算机数据交换格式,类似于 JSON)的键/值对组成。 insert() 与 save() 方法 您可以使用 MongoDB 中的 insert() 或 save() 方法向集合中插入文档,语法如下: db.

  • 问题内容: 我的文档中具有以下结构: 我想更新 someField 和 someField2, 但仅更新数组中的一项,与 _arrayId 匹配的 项 (例如;并且仅针对此文档(例如)),而不更新其他项。 该 arrayIds 是不是唯一的,这就是为什么我需要它是针对特定文档的文档。如果要为数组中存在的每个文档更新该值,则可以使用,但这不是我想要的。 我试图在Java中完成此操作,但也可以使用命令

  • 在我的问题的答案中给出了如何使用Mongoose来使用新的运算符的很好的解释。建议的解决方案非常适合简单的数组。如果数组在子文档中或数组的每个元素都是数组,则建议的解决方案不起作用。我的意思是这样的: