【问题标题】:Mongoose findOne returns empty array fieldMongoose findOne 返回空数组字段
【发布时间】:2017-08-18 01:20:28
【问题描述】:

我有一个简单的嵌入文档:

{
    "username":"user001",
    "name":"John",
    "tasks":[
        {           
            "id":0,
            "title":"Candy",
            "description":"Lots of candy for you",
            "category":"food",
            "cost":2500,
            "candyTypes":[
                {"name":"gum", "type":"sweet", "price":"2"},
                {"name":"chocolate", "type":"tasty", "price":"3"}
            ]
        }
    ]
}

当我尝试通过 mongo shell 查询任务数据时,我得到了一切:

db.users.findOne({ 'username': 'user001', 'tasks.id':4 }, {'tasks.$':1})

/* returns */

"tasks":[
    {           
        "id":0,
        "title":"Candy",
        "description":"Lots of candy for you",
        "category":"food",
        "cost":2500,
        "candyTypes":[
             {"name":"gum", "type":"sweet", "price":"2"},
             {"name":"chocolate", "type":"tasty", "price":"3"}
        ]
    }
]

但是当我尝试在猫鼬中做同样的事情时,candyTypes 数组返回为空:

Users.findOne({ 'username': username, 'tasks.id':taskId }, {'tasks.$':1}, function (err, data) {
        console.log(data);
}); 

/* returns */

"tasks":[
    {           
        "id":0,
        "title":"Candy",
        "description":"Lots of candy for you",
        "category":"food",
        "cost":2500,
        "candyTypes":[]
    }
]

我对 MongoDB 和 Mongoose 还很陌生,但是在搜索和查看文档之后,我无法弄清楚我缺少什么。

更新

我有几个用户请求它,所以这是我的猫鼬模式:

var UserSchema = new mongoose.Schema({
    username:String,
    name:String,
    tasks:[{
        id: Number,
        title: String,
        description:String,
        category: String,
        cost: Number,
        candyTypes:[{
            title:String, 
            type:String, 
            value:String
        }]
    }]
});

【问题讨论】:

  • 你能告诉我们你的架构定义吗?
  • 试着控制你的用户名和任务 ID 是否与你用于 mongo shell 的相同
  • 是的,它们是一样的。实际上我在这个数据库中只有一个测试用户
  • 您可以尝试在 UserSchema 之前定义 CandyTypeSchema 吗? 1. 定义var CandyTypeSchema = new Schema({ name: String, type: String, value:String }); 和 2. 在tasks 属性中引用candyTypes:[CandyTypeSchema]。我猜它是 mongoose 不支持/不喜欢的深度嵌入级别。
  • 我试图避免使用引用,主要是因为这是非常少量的数据,添加引用和不同的模式会不必要地增加整个应用程序的复杂性。 Mongoose 不支持嵌入数据吗?我浏览了他们的文档,但找不到任何关于使用嵌入式数据的限制。如果是这样的话,我可能只需要放弃 mongoose 并使用 MongoClient 驱动程序

标签: node.js mongodb mongoose


【解决方案1】:

使用 Mongoose,您必须填充 candyTypes 数组:

Users.findOne({ 'username': username, 'tasks.id':taskId }, {'tasks.$':1})
.populate('candyTypes')
.exec(function (err, data) {
  console.log(data);
});

参见文档:http://mongoosejs.com/docs/populate.html

【讨论】:

  • 嗨,泰勒,感谢您的帮助。奇怪的是,我在发布这个问题之前确实尝试过使用populate(),但我仍然得到了相同的输出。
  • 我看到 candyTypes 实际上是 tasks 数组中的一个数组,所以您可能必须使用 .populate('tasks.candyTypes')
  • 我尝试了.populate('tasks.candyTypes') 并得到了一个错误。然后我试了.populate('tasks.$.candyTypes'),没有报错,但是输出和之前一样。
  • .populate({path: 'tasks',populate: { path: 'tasks.candyTypes }})
  • 不。同样的问题。感谢您尝试提供帮助。
【解决方案2】:

我觉得和你声明一个叫type的字段有关,这个字段在Mongoose中也有特殊含义,即表示字段的类型。

如果您将该字段重命名为其他名称 (candyType),它可能会更好。

或者,您可以使用 typeKey 选项让 Mongoose 使用不同的属性名称来表示字段类型。

顺便说一句,您的文档包含一个字段 price,但您的架构将其命名为 value

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 2018-04-03
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2020-07-03
    • 2013-12-17
    • 2015-08-16
    相关资源
    最近更新 更多