查询以在 mongodb 中检索数组中的多个对象
query to retrieve multiple objects in an array in mongodb
假设我有如下对象数组。
"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} 对象)来完成这个之后
find({"_id" : ObjectId("5492690f72ae469b0e37b61c")}) 查询?因为 find 会一次检索文档并将其保存在 RAM 中。但是,如果我们使用聚合,则需要在 RAM 中执行四个操作才能获得输出。
为什么我问第3)个问题是:假设如果同时访问数千个客户端,那么RAM内存就会过载。如果使用 Java 完成,RAM 上的任务较少。
4) workingSet 将在 RAM 中存在多长时间??
我的理解对吗???
如有错误请指正
请建议我对此有正确的见解..
没有。您用 $
投射第一个匹配项,投射所有匹配项,或者投射其中 none 个。
没有。如果您必须使用此数组,聚合将允许您提取多个匹配元素,但正确的解决方案,从概念上和性能上来说,是设计您的文档结构,这样这个问题就不会出现,或者只出现在罕见的查询中其性能不是特别重要。
是。
我们没有任何信息可以让我们对这个问题给出一个合理的答案。这也超出了问题其余部分的范围,应该是一个单独的问题。
假设我有如下对象数组。
"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} 对象)来完成这个之后 find({"_id" : ObjectId("5492690f72ae469b0e37b61c")}) 查询?因为 find 会一次检索文档并将其保存在 RAM 中。但是,如果我们使用聚合,则需要在 RAM 中执行四个操作才能获得输出。
为什么我问第3)个问题是:假设如果同时访问数千个客户端,那么RAM内存就会过载。如果使用 Java 完成,RAM 上的任务较少。
4) workingSet 将在 RAM 中存在多长时间??
我的理解对吗???
如有错误请指正
请建议我对此有正确的见解..
没有。您用
$
投射第一个匹配项,投射所有匹配项,或者投射其中 none 个。没有。如果您必须使用此数组,聚合将允许您提取多个匹配元素,但正确的解决方案,从概念上和性能上来说,是设计您的文档结构,这样这个问题就不会出现,或者只出现在罕见的查询中其性能不是特别重要。
是。
我们没有任何信息可以让我们对这个问题给出一个合理的答案。这也超出了问题其余部分的范围,应该是一个单独的问题。