假设我有一个对象数组,如下所示。
"array" : [
{
"id" : 1
},
{
"id" : 2
},
{
"id" : 2
},
{
"id" : 4
}
]
如果我想从此数组中检索多个对象( {id:2} ),则聚合查询将如下所示。
db.coll.aggregate([{ $match : {"_id" : ObjectId("5492690f72ae469b0e37b61c")}}, { $unwind : "$array"}, { $match : { "array.id" : 2}}, { $group : { _id : "$_id", array : { $push : { id : "$array.id"}}}} ])
以上聚合的输出是
{
"_id" : ObjectId("5492690f72ae469b0e37b61c"),
"array" : [
{
"id" : 2
},
{
"id" : 2
}
]
}
现在的问题是: 1)是否可以使用MongoDB中的 find()从数组中检索多个对象?
2)关于性能,聚合是正确的方法吗? (因为我们需要使用四个管道运算符)?
3)我们可以使用Java操作(循环数组并且只保留{id:2}对象)来执行此操作 查找({“_ id”:ObjectId(“5492690f72ae469b0e37b61c”)})查询?因为find将检索文档并将其保存在RAM中。但是如果我们使用聚合,则需要在RAM中执行四个操作以获得输出。
为什么我问3)问题是:假设如果数千个客户端同时访问,则RAM内存将被重载。如果使用Java完成,则RAM上的任务较少。
4) workSet在RAM中的持续时间 ??
我的理解是否正确???
如果我错了,请纠正我。
请建议我对此有正确的见解..
答案 0 :(得分:3)
没有。您将第一个匹配的项目与$
进行投影,投影所有项目,或者不投影任何项目。
没有肥胖型。如果必须使用此数组,聚合将允许您提取多个匹配元素,但从概念上和性能上,正确的解决方案是设计文档结构,以便不会出现此问题,或仅出现罕见查询其表现并不是特别重要。
是
我们没有任何信息可以让我们对这个问题给出合理的答案。相对于问题的其余部分,这也超出了范围,应该是一个单独的问题。