MongoDB聚合错误$需要一个数组

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 } { "

下面是我的文档,我想过滤所有这些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 }
{ "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:请将其标记为已接受,这样您的问题将以有效答案完成:-)请不要仅发布代码作为答案,但也要解释一下你的代码是做什么的,以及它是如何解决问题的。带有解释的答案通常质量更高,并且更有可能吸引更多的选票。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。