MongoDB聚合错误$需要一个数组
下面是我的文档,我想过滤所有这些zipcode及其相应的MongoDB聚合错误$需要一个数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,下面是我的文档,我想过滤所有这些zipcode及其相应的res\u count,它们也存在于名为data的数组中 文档: { "data" : [ "10451", "10458", "10467", "10461", "10462" ] } { "zipcode" : "10470", "res_count" : 8 } { "zipcode" : "10454", "res_count" : 10 } { "zipcode" : "10466", "res_count" : 11 } { "
res\u count
,它们也存在于名为data
的数组中
文档:
{ "data" : [ "10451", "10458", "10467", "10461", "10462" ] }
{ "zipcode" : "10470", "res_count" : 8 }
{ "zipcode" : "10454", "res_count" : 10 }
{ "zipcode" : "10466", "res_count" : 11 }
{ "zipcode" : "10455", "res_count" : 9 }
{ "zipcode" : "10462", "res_count" : 29 }
{ "zipcode" : "10461", "res_count" : 25 }
{ "zipcode" : "10467", "res_count" : 15 }
{ "zipcode" : "10465", "res_count" : 28 }
{ "zipcode" : "10452", "res_count" : 11 }
{ "zipcode" : "10469", "res_count" : 10 }
{ "zipcode" : "10459", "res_count" : 7 }
{ "zipcode" : "10457", "res_count" : 14 }
{ "zipcode" : "10451", "res_count" : 68 }
{ "zipcode" : "10463", "res_count" : 28 }
{ "zipcode" : "10458", "res_count" : 34 }
{ "zipcode" : "10468", "res_count" : 12 }
{ "zipcode" : "10475", "res_count" : 14 }
{ "zipcode" : "10474", "res_count" : 10 }
{ "zipcode" : "10473", "res_count" : 3 }
我尝试在中使用$in,但它说的是“errmsg”:“$in需要一个数组”
试试这个:
db.find(
{ zipcode: { $in: [ "10451", "10458", "10467", "10461", "10462" ] } }
)
试试这个:
db.find(
{ zipcode: { $in: [ "10451", "10458", "10467", "10461", "10462" ] } }
)
因为您在一个文档中只有数据
字段。因此,如果您在$match
中运行$in
类似于{$match:{$in:['$zipcode','$data']}}
的东西,它将抛出相同的错误“errmsg”:“$in需要一个数组”
但是为什么呢?
通常,对集合文档执行操作时,会将每个文档原子化,因此不能将一个文档的字段用于其他文档。(Ex:-如果您尝试添加取自$data
的新字段“dataCopy”-addFields不会向不存在“data”字段的文档添加任何新字段)。因此,要执行此操作,您需要使用$group
将集合中的所有文档合并到一个文档中,请尝试以下聚合查询:
db.collection.aggregate([
/** Iterate on all docs & push document which has 'data' field into 'dataDoc' &
* push all other docs into 'allDocs' array field
*/
{
$group: {
_id: "",
dataDoc: {
$push: {
$cond: [{ $eq: [{ $type: "$data" }, "array"] }, "$$ROOT", "$$REMOVE"]
}
},
allDocs: {
$push: {
$cond: [
{ $eq: [{ $type: "$zipcode" }, "string"] },
"$$ROOT",
"$$REMOVE"
]
}
}
}
},
/** Unwind dataDoc array to make it 'dataDoc' field of type object */
{
$unwind: "$dataDoc"
},
/** Re-create 'allDocs' array field with objects which meet required condition,
* newly formed array will have docs whose zipcode exists in data array
* */
{
$addFields: {
allDocs: {
$filter: {
input: "$allDocs",
cond: { $in: ["$$this.zipcode", "$dataDoc.data"] }
}
}
}
},
/** Unwind 'allDocs' array */
{
$unwind: "$allDocs"
},
/** Make 'allDocs' object field as new root, after this your result will have docs
* whose zipcode exists in data array
*/
{
$replaceRoot: {
newRoot: "$allDocs"
}
}
]);
测试:因为您在一个文档中就有了数据字段。因此,如果您在$match
中运行$in
类似于{$match:{$in:['$zipcode','$data']}}
的东西,它将抛出相同的错误“errmsg”:“$in需要一个数组”
但是为什么呢?
通常,对集合文档执行操作时,会将每个文档原子化,因此不能将一个文档的字段用于其他文档。(Ex:-如果您尝试添加取自$data
的新字段“dataCopy”-addFields不会向不存在“data”字段的文档添加任何新字段)。因此,要执行此操作,您需要使用$group
将集合中的所有文档合并到一个文档中,请尝试以下聚合查询:
db.collection.aggregate([
/** Iterate on all docs & push document which has 'data' field into 'dataDoc' &
* push all other docs into 'allDocs' array field
*/
{
$group: {
_id: "",
dataDoc: {
$push: {
$cond: [{ $eq: [{ $type: "$data" }, "array"] }, "$$ROOT", "$$REMOVE"]
}
},
allDocs: {
$push: {
$cond: [
{ $eq: [{ $type: "$zipcode" }, "string"] },
"$$ROOT",
"$$REMOVE"
]
}
}
}
},
/** Unwind dataDoc array to make it 'dataDoc' field of type object */
{
$unwind: "$dataDoc"
},
/** Re-create 'allDocs' array field with objects which meet required condition,
* newly formed array will have docs whose zipcode exists in data array
* */
{
$addFields: {
allDocs: {
$filter: {
input: "$allDocs",
cond: { $in: ["$$this.zipcode", "$dataDoc.data"] }
}
}
}
},
/** Unwind 'allDocs' array */
{
$unwind: "$allDocs"
},
/** Make 'allDocs' object field as new root, after this your result will have docs
* whose zipcode exists in data array
*/
{
$replaceRoot: {
newRoot: "$allDocs"
}
}
]);
测试:您能分享您使用的完整查询语法吗?实际上,上面的文档不是原始文档。它是我通过使用$facets运行不同的查询并将它们组合而得到的结果文档。我只需要访问$in中的$data以筛选出匹配项zipcode@anonymous:有效还是仍有问题?@anonymous:请将其标记为已接受,这样您的问题将以有效答案完成:-)您可以共享您使用的完整查询语法吗。实际上,上述文档不是原始文档。它是我通过使用$facets运行不同的查询并将它们组合而得到的结果文档。我只需要访问$in中的$data以筛选出匹配项zipcode@anonymous:有效还是仍有问题?@anonymous:请将其标记为已接受,这样您的问题将以有效答案完成:-)请不要仅发布代码作为答案,但也要解释一下你的代码是做什么的,以及它是如何解决问题的。带有解释的答案通常质量更高,并且更有可能吸引更多的选票。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。