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 返回一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose findOne() 和 find() 返回无效值,它们应该分别返回 null / 空列表

Mongoose 聚合 $match 返回空结果

空对象模式

getStaticProps 返回一个空对象

我的 ObjectType 正在返回一个空对象 [重复]

Browserify 需要返回一个空对象