UpdateOperations 嵌入式数组
UpdateOperations embedded array
我有这样的结构:
{
_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);
我也读到了这个 post Update an item in an array that is in an array 说
$ operator does not work "with queries that traverse nested arrays".
所以我尝试了类似的方法:
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);
但是还是不行。知道如何解决这个问题吗?我收到的错误消息是不能使用部分...来横向元素
根据您的替代用例,我认为您应该 "invert" 您的架构。每个文档将代表一个 lecture
并将用其 theme
、edition
和 event
:
标记
{
"_id" : ObjectId("54da1ff0a9ce603a239c3075"),
"event" : "X0004",
"edition" : "A0002,
"theme" : "RT0005",
"votes" : 22
}
event
、edition
和 theme
可以是某种标识符,并且可能是对 event
、edition
和 [= 的引用13=] 其他集合中的文档。要为特定讲座投票,只需按 _id
:
更新即可
db.test.update({ "_id" : ObjectId("54da1ff0a9ce603a239c3075") }, { "$inc" : { "votes" : 1 } })
虽然我不知道您的全部要求,但我认为根据您的示例用例,这是一个更好的基本设计。
我有这样的结构:
{
_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);
我也读到了这个 post Update an item in an array that is in an array 说
$ operator does not work "with queries that traverse nested arrays".
所以我尝试了类似的方法:
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);
但是还是不行。知道如何解决这个问题吗?我收到的错误消息是不能使用部分...来横向元素
根据您的替代用例,我认为您应该 "invert" 您的架构。每个文档将代表一个 lecture
并将用其 theme
、edition
和 event
:
{
"_id" : ObjectId("54da1ff0a9ce603a239c3075"),
"event" : "X0004",
"edition" : "A0002,
"theme" : "RT0005",
"votes" : 22
}
event
、edition
和 theme
可以是某种标识符,并且可能是对 event
、edition
和 [= 的引用13=] 其他集合中的文档。要为特定讲座投票,只需按 _id
:
db.test.update({ "_id" : ObjectId("54da1ff0a9ce603a239c3075") }, { "$inc" : { "votes" : 1 } })
虽然我不知道您的全部要求,但我认为根据您的示例用例,这是一个更好的基本设计。