findOne 返回一个空对象
Posted
技术标签:
【中文标题】findOne 返回一个空对象【英文标题】:findOne returns a null object 【发布时间】:2018-12-17 23:39:01 【问题描述】:我正在尝试查找并删除 _id
的子文档,但它总是返回 null。
这是我的User
架构:
// Create sub-document schema for items
var itemSchema = new mongoose.Schema (
type: String,
colour: String,
material: String,
brand: String,
_id: String,
)
// Main user schema (incl. wardrobe)
const userSchema = new mongoose.Schema(
email: type: String, unique: true ,
password: String,
passwordResetToken: String,
passwordResetExpires: Date,
facebook: String,
twitter: String,
google: String,
github: String,
instagram: String,
linkedin: String,
steam: String,
tokens: Array,
profile:
name: String,
gender: String,
location: String,
website: String,
picture: String
,
wardrobe:
items: [[itemSchema]]
, timestamps: true );
这是一个示例对象:
"_id":
"$oid": "5c16d181c15a68c14fe2f2d3"
,
"wardrobe":
"items": [
[
"type": "T-shirt",
"colour": "Black",
"material": "Wool",
"brand": "Adidas",
"_id": "5c1827dcc13025f86gfdf053"
],
[
"type": "T-shirt",
"colour": "Black",
"material": "Cotton",
"brand": "Puma",
"_id": "5c1827dfc13025f86dfaf075"
]
]
,
"tokens": [],
"email": "test@test.com",
"password": "$2a$10$tyCl4frHgAA1m8p6Y6kAkeAbjdYK1SJ5ghnlvWCF/MAb9.hMfR2/a",
"createdAt":
"$date": "2018-12-16T22:28:17.777Z"
,
"updatedAt":
"$date": "2018-12-17T23:10:02.301Z"
,
"__v": 16,
"profile":
"gender": "",
"location": "",
"name": "Test",
"website": ""
这就是我使用findOne
的方式:
exports.deleteItem = (req, res, next) =>
User.findOne("wardrobe.items._id": "5c1827dfc13025f86dfaf075", (err, item) =>
console.log(item);
if (err)
return console.log("error: " + err);
res.redirect('/wardrobe');
);
;
console.log(item)
始终返回 null,即使 id 字段是现有文档。有什么想法吗?
【问题讨论】:
能否将文件添加到您的 mongo 中以获取更多信息? 添加示例 【参考方案1】:exports.deleteItem = (req, res, next) =>
User.findOne("wardrobe.items[0]._id": "5c1827dfc13025f86dfaf075", (err, item) =>
console.log(item);
if (err)
return console.log("error: " + err);
res.redirect('/wardrobe');
);
;
wardrobe
是一个对象,但 items
是一个数组,所以你应该去第一项
【讨论】:
谢谢,但这不起作用。console.log(item)
仍然返回 null。
wardrobe.items[0]._id: "5c1827dfc13025f86dfaf075"
这是最后一个。可以试试吗?
不走运。有了这个,我得到:SyntaxError: Unexpected token .
在示例文档中,子文档嵌套在两个数组中。应该是这个原因,试试wardrobe. items[0] [0] ._id
【参考方案2】:
经过多次反复试验,我发现$elemMatch
是我所需要的。这将返回整个对象:
exports.deleteItem = (req, res, next) =>
User.findOne( 'wardrobe.items': $elemMatch: "_id": "5c1985359db5074cb3da562d", , wardrobe:1, (err, item) =>
console.log(item);
if (err)
return console.log("error: " + err);
res.redirect('/wardrobe');
);
;
但是我不想要整个对象,我想要搜索 _id
的特定对象。但这是另一个问题。
【讨论】:
以上是关于findOne 返回一个空对象的主要内容,如果未能解决你的问题,请参考以下文章