为什么使用MongoDB中的findOne得到的是一个null呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么使用MongoDB中的findOne得到的是一个null呢相关的知识,希望对你有一定的参考价值。

参考技术A 一种情况是确实没有查询到数据,二是你的查询命令有问题,三其他原因。

使用 findOne 更新 mongoDB 文档中的子字段并保存

【中文标题】使用 findOne 更新 mongoDB 文档中的子字段并保存【英文标题】:Updating a subfield in a mongoDB document using findOne and save 【发布时间】:2013-10-10 12:40:20 【问题描述】:

我正在尝试更新 mongoDB 文档中的特定子字段,并决定首先找到有问题的对象,然后保存更新的对象。出于某种原因,保存选项似乎忽略了我的更改。

我的集合中有一个对象,它符合以下架构:

var tschema= mongoose.Schema(
a: Object
)

var t = db.model('tongoose',tschema);
t.findOne(,function(err,obj)
  console.log(obj.a); //yields ['banana',3]     
  obj.a[1]=1; //to make ['banana',1]
  console.log(obj); //yields ['banana',1]

  obj.save(function(err,real)
    console.log(real); //yields ['banana',1]
  );
);

但是当我回到 mongoDB 并查找保存的对象时,它从未显示任何更改。你能发现我做错了什么吗?

非常感谢。

【问题讨论】:

【参考方案1】:

由于您的架构将a 定义为通用对象,因此该字段被Mongoose 视为Mixed 类型,您需要通过调用markModifiedsave 将其标记为已更改,否则save 将忽略更改。

obj.markModified('a');
obj.save(function(err,real) ...

请参阅文档的this page 上对Mixed 类型的讨论。

【讨论】:

以上是关于为什么使用MongoDB中的findOne得到的是一个null呢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 findOne 查询 mongodb 并排除数组中的一些嵌套字段

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

如何正确使用 findOne mongoDB 查询?

findOne 方法不能使用两个数据源(MySQL 和 MongoDB)编译

带有嵌入式文档的MongoDB findOne()和updateOne()

Mongoose 中的 Model.findOne() 和 Model.findById() 有啥区别?