【问题标题】:MongoDB returns all records even after specifying fields即使在指定字段后,MongoDB 也会返回所有记录
【发布时间】:2013-10-03 13:09:49
【问题描述】:
> db.checklistDB.find({},{title:1, _id:0})
{ "title" : "Untitled Checklist" }
{  }
{  }
{  }
{  }
{  }
> db.checklistDB.find({},{title:1})
{ "title" : "Untitled Checklist", "_id" : "4FaJcAkzAY3Geyggm" }
{ "_id" : "3imNYy8SPcRDjLcqz" }
{ "_id" : "977fPtvEn7hiStqzp" }
{ "_id" : "QcAEMnr6R7qfaWFR8" }
{ "_id" : "eEsmKMdQGYKqnhTNB" }
{ "_id" : "cL6R8qxwWhvTr2kmy" }

大家好,

从上面可以看出,我 rand 2 个命令:

db.checklistDB.find( {} , { title : 1 } ) 和 *db.checklistDB.find( {} , { title : 1 , _id : 0} )

两个查询都返回 6 条记录,即数据库中存在的所有记录。我想它只会返回具有“标题”作为字段的记录。有什么我做错了吗?

【问题讨论】:

    标签: mongodb meteor mongodb-query


    【解决方案1】:

    find 的第二个参数是投影。在您的情况下,它会在文档中查找 title 字段,如果不存在则返回 none。如果你想过滤文档,你应该使用这样的查询:

     db.checklistDB.find({title: {$exists: true}}, {title:1, _id:0})
    

    编辑 如果您接受查询:

    db.checklistDB.find({}, {title:1, _id:0})
    

    它转换为:检索所有文档({} 作为查询参数),如果存在,给我title,如果不存在,给我默认值(none)({title:1, _id:0} 作为投影参数) .投影参数仅用于转换而不是过滤文档。

    【讨论】:

    • 我原以为我的查​​询会转化为: 从 checklistDB 中选择标题;它返回所有正确的标题,但不知何故还包括所有其他记录的所有_id。您的查询在哪里,例如 select title from checklistdb where exists title;但它有效:) 谢谢!
    • 我发布了简短的更新,并提供了更好的解释。
    猜你喜欢
    • 2020-01-12
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2018-08-04
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多