UpdateOperations嵌入式数组

时间:2015-02-09 13:13:23

标签: arrays mongodb morphia

我有这样的结构:

{
  _id: 123,
  bs: [
    {
      _id: 234,
      cs: [
        {
          _id: 456,
          ds : [
            {
              _id: 678,
              emails[
                "email@gmail.com"
              ]
            }
          ]
        }
      ]
    }
  ]
}

我在Morphia的课程看起来像这样

@Entity
public class A {

  @Id
  private ObjectId id;

  @Embedded
  private List<B> bs;
}

public class B {

  private ObjectId id;

  @Embedded
  private List<C> cs;
}

public class C {

  private ObjectId id;

  @Embedded
  private List<D> ds;
}

public class D {

  private ObjectId id;

  @Embedded
  private List<String> emails;
}

我要做的是在Morphia的嵌入式数组中插入一封电子邮件而不检索所有元素A并使用updateFirst。

这是我正在尝试执行的查询

Query<Event> query = this.basicDAO.createQuery();
query.criteria(Mapper.ID_KEY).equal(new ObjectId(aID));
query.criteria("bs.cs.id").equal(new ObjectId(cID));
query.criteria("bs.cs.ds.id").equal(dID);

UpdateOperations<Event> updateOps = this.basicDAO.createUpdateOperations().set("bs.cs.ds.$.emails", email);

this.basicDAO.update(query, updateOps);

我也读过这篇文章Update an item in an array that is in an array并说了

  

$运算符不起作用&#34;查询遍历嵌套数组&#34;。

所以我尝试了类似的东西:

D d = new D(dID);
C c = new C(new ObjectId(cID));

Query<Event> query = this.basicDAO.createQuery();
query.criteria(Mapper.ID_KEY).equal(new ObjectId(aID));
query.field("bs.cs").hasThisElement(c);
query.field("bs.cs.ds").hasThisElement(d);

UpdateOperations<Event> updateOps = this.basicDAO.createUpdateOperations().set("bs.cs.ds.emails", email);

this.basicDAO.update(query, updateOps);

然而它仍然无法运作。知道怎么解决这个问题?我收到的错误消息是不能使用部分...横向元素

1 个答案:

答案 0 :(得分:1)

根据您的替代用例,我认为您应该“反转”您的架构。每个文档都代表一个lecture,并会标记为themeeditionevent

{
    "_id" : ObjectId("54da1ff0a9ce603a239c3075"),
    "event" : "X0004",
    "edition" : "A0002,
    "theme" : "RT0005",
    "votes" : 22
}

eventeditiontheme可以是某种标识符,可能是对eventedition和{{1}的引用其他集合中的文档。要为特定讲座投票,只需按theme

更新
_id

虽然我不了解您的全部要求,但我认为根据您的示例用例,这是一个更好的基本设计。