Node.js 如何在Mongoose中检查重复文档?

Node.js 如何在Mongoose中检查重复文档?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,以下是我收藏中的嵌套文档示例: "person" : [ { "title" : "front-end developer", "skills" : [ { "name" : "js", "project" : "1", }, { "name" : "CSS", "project" : "5", } ] }, { "title" : "sof

以下是我收藏中的嵌套文档示例:

"person" : [
  {
    "title" : "front-end developer",
    "skills" : [
      {
        "name" : "js",
        "project" : "1",
      },
      {
        "name" : "CSS",
        "project" : "5",
      }
    ]
  },
  {
    "title" : "software engineer",
    "skills" : [
      {
        "name" : "Java",
        "project" : "1",
      },
      {
        "name" : "c++",
        "project" : "5",
      }
    ]
  }
]

是否有一种简单的方法来确定其他文档是否与此对象相同,例如具有相同的键、值和数组索引?目前,我检查重复项的方法非常长,需要多个嵌套循环。任何帮助都将不胜感激。谢谢

如果您希望在您的收藏中获得相同(除了
\u id
字段外)文档的列表,以下是您可以做到的方法:

collection.aggregate({
    $project: {
        "_id": 1, // keep the _id field where it is anyway
        "doc": "$$ROOT" // store the entire document in the "doc" field
    }
}, {
    $project: {
        "doc._id": 0 // remove the _id from the stored document because we do not want to compare it
    }
}, {
    $group: {
        "_id": "$doc", // group by the entire document's contents as in "compare the whole document"
        "ids": { $push: "$_id" }, // create an array of all IDs that form this group
        "count": { $sum: 1 } // count the number of documents in this group
    }
}, {
    $match: {
        "count": { $gt: 1 } // only show what's duplicated
    }
})

与聚合框架一样,您可以通过注释所有步骤,然后分阶段再次激活所有内容,来尝试了解每个步骤中到底发生了什么。

不幸的是,没有,您必须自己进行比较。你到底想知道什么?您想知道您的数据库中是否已经有重复的文档吗?还是要检查数据库中是否有与您尝试插入的文档匹配的文档?还是别的?谢谢@GrégoryNEUT我会查看think链接。谢谢嗨@dnickless,我正在寻找后者。我的集合中已经有一个文档,我需要查询所有其他文档,以便在键、值和索引顺序方面找到相同的匹配项。谢谢非常感谢您的回答@dnickless!我必须研究聚合框架,因为它对我来说是新事物。请问,如果skills数组中的对象包含嵌套的对象数组,我将如何修改聚合函数?谢谢我想你不需要改变任何事情。我的解决方案是完全通用的。它不会对您的文档结构进行任何假设。太棒了,我真的非常感谢您的帮助,再次感谢!嘿@dnickless!我一直在玩弄你的答案,遇到了另一个问题,我在这里发布了一个问题:stackoverflow.com/questions/46412412/…。你介意看一下吗?这和这个问题很相似,我被难倒了!