我有一个"类"文件:
{
className: "AAA",
students: [
{name:"An", age:"13"},
{name:"Hao", age:"13"},
{name:"John", age:"14"},
{name:"Hung", age:"12"}
]
}
Run Code Online (Sandbox Code Playgroud)
我希望得到名字为"An"的学生,只获得数组"学生"中的匹配元素.我可以用函数find()做到这一点:
>db.class.find({"students.name":"An"}, {"students.$":true})
{
"_id" : ObjectId("548b01815a06570735b946c1"),
"students" : [
{
"name" : "An",
"age" : "13"
}
]}
Run Code Online (Sandbox Code Playgroud)
这很好,但是当我使用Aggregation执行相同操作时,会出现错误:
db.class.aggregate([
{$match:{"students.name":'An'}},
{$project:{"students.$":true}}
])
Run Code Online (Sandbox Code Playgroud)
错误是:
uncaught exception: aggregate failed: {
"errmsg" : "exception: FieldPath field names may not start with '$'.",
"code" : 16410,
"ok" : 0
}
Run Code Online (Sandbox Code Playgroud)
为什么?我不能在aggregate()的$ project运算符中使用"$"作为数组,而在find()的项目运算符中可以使用这个.
我们已经知道,当我们从Map获取元素时,元素的值将被克隆,例如:
Map<String, MyObject> map = new HashMap();
MyObject obj = new MyObject();
//put
map.put("id1", obj);
//get
MyObject obj1 = map.get("id1");
MyObject obj2 = map.get("id1"); //"obj2" is only a clone of "obj1"
//change some things
obj1.setName("AAA");
obj2.setName("BBB");
//show: they are different
obj1.printName(); //Print: AAA
obj2.printName(); //Print: BBB
Run Code Online (Sandbox Code Playgroud)
但是,我想要一个返回原始实例的Map,是否有类似的Map?
Map<String, MyObject> map = new AUnknownMap();
MyObject obj = new MyObject();
//put
map.put("id1", obj);
//get
MyObject obj1 = map.get("id1");
MyObject obj2 = map.get("id1"); //"obj2" and "obj1" refer the same instance
//change …Run Code Online (Sandbox Code Playgroud)