【问题标题】:Why did this mongoose search match these documents?为什么这个猫鼬搜索匹配这些文件?
【发布时间】:2016-03-31 03:14:17
【问题描述】:

我试图弄清楚我的一个用户是否有任何与代码“2”的​​目标相关联的数据(这意味着一个错误),所以我搜索了 mongoose

Entry.find({userid: req.user._id, 'goalSummary.2': {$exists: true}})

goalSummary 属性是 mongoose.Schema.Types.Mixed 类型,其键与目标代码相同(作为字符串,如果重要的话)和对象作为值。

我得到了 16 个结果,每个结果都有 goalSummarys 这样的:

goalSummary: {
    "1": {
        outcomes: 1,
        intendedcount: 1,
        extrascount: 0,
        notdonecount: 0,
        enough: "e"
    },
    "3": {
        outcomes: 1,
        intendedcount: 1,
        extrascount: 0,
        notdonecount: 0,
        enough: "e"
    },
    [...]
}

...即没有2 键。为什么这些可以匹配? 2 是否设置为 undefined 但未删除?它成功地没有匹配数百个其他条目。

【问题讨论】:

  • 您能否编辑您的问题以提供一个完整、可重现的示例,其中包括您的架构和您的查询意外返回的文档?

标签: node.js mongodb search mongoose mongoose-schema


【解决方案1】:

"field.2" 仅在 Array 类型的猫鼬属性中才有意义。对于 Mixed,mongoose 对您的文档一无所知任何,因此只要有值,它就会匹配所有内容。

在旁注中,我自己被烧死并看到其他人重复它,我也可以建议你不要使用键来命名东西。而是执行 { key: 1, value: {outcomes: 1 ... }} 之类的操作。

【讨论】:

  • 但这不是它所做的。它成功地不匹配曾经设置为 2 的值的项目,但据我所知,它匹配的项目是那些从未设置为 2 的值(或者可能设置为未定义)
  • 还有,你是怎么被那些东西烫到的?在很多情况下,它们似乎对我有帮助,而且我通常不会被它们查询(这是一次性的事情,而不是终点)。
  • 使用聚合时。你想要像 $sum: '$key' 这样的东西——如果键值是实际的键,那就不行了。有点像:{书:3,帖子:2}。如果您有多个这样的类别并且不知道每个类别有多少(例如文章、博客...),则您无法汇总 - 您必须将它们全部列举出来。所以你必须退回到 mapreduce。
  • 至于为什么它与你的“2”相匹配,而显然没有一个,我只能推测。如果你有一个“2”,但它是未定义的,那么它肯定符合它存在的条件。否则,我不确定。你能找到一个最小的可重现版本吗?我可以测试两个文档和简单的数据模型,看看它是否可重复?
  • 哦,我的印象是,如果您将某些内容设置为 undefined 然后 mongo 将其删除,然后它就不再存在(因为它没有出现在对象中,我'已经看到)。但如果这不是它的工作原理,那么这可能就是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2014-09-14
  • 1970-01-01
  • 2012-04-23
  • 2019-08-12
  • 1970-01-01
相关资源
最近更新 更多