我有一个Mongoose模型,它有嵌套数组和子文档。
发布到对象数组/子文档时,我似乎没问题,但是我遇到了.put
的问题我对params进行了硬编码测试,以防他们因某些原因没有从PostMan进来。
我从上面的代码得到的结果是一个空数组!
所以我得到了正确的记录,它创建了“手机”数组,但没有填充。
.put(function(req, res){
Member.find({'_id':req.params.id}, function(err, member){
if(err)
res.send(err);
member.phone.push({
number: "78787878787",
phoneType: 2
})
member.save(function(err){
if(err)
res.send(err);
res.json(member);
});
});
});
我想要一个只添加另一个“电话”记录的端点。
这是我的模特:
//DEPENDENCIES
var mongoose = require('mongoose');
var contactSchema = new mongoose.Schema({
name:{type:String},
age:{type:Number}
});
var phoneSchema = new mongoose.Schema({
number:{ type: String },
phoneType:{ type: Number }
})
var memberSchema = new mongoose.Schema({
firstname: {
type: String
},
lastname: {
type: String
},
phone:[phoneSchema],
contacts:[contactSchema]
});
//RETURN MODEL
module.exports = mongoose.model('member', memberSchema);
现在当我运行我的代码时,我得到以下未定义的“成员”:
{ id: '587bcbffe64e9f28a6894dd7' }
[ { _id: 587bcbffe64e9f28a6894dd7,
lastname: 'Stanley',
firstname: 'Dave',
__v: 0,
contacts: [ [Object] ],
phone: [] } ]
events.js:154
throw er; // Unhandled 'error' event
^
TypeError: Cannot read property 'push' of undefined
答案 0 :(得分:1)
find
返回一个文档数组,而不仅仅是一个文档。这就是为什么当你尝试member.phone
时它会出错。
findOne
使用find
代替querying
_id
,return
只会null
只有一个匹配的文档或find
(如果result
它不存在),所以它比null
更好。
此外,最好检查member
是否为null
。如果不存在_id
,Member.findOne({'_id':req.params.id}, function(err, member){
if(err)
res.send(err);
else if(member!=null)
{
member.phone.push({
number: "78787878787",
phoneType: 2
});
member.save(function(err){...});
}
});
将为find
。
member[0]
如果您热衷于使用member
。使用Member.find({'_id':req.params.id}, function(err, member){
if(err)
res.send(err);
else if(member.length!=0)
{
member[0].phone.push({
number: "78787878787",
phoneType: 2
});
member[0].save(function(err){...});
}
});
(第一个元素)代替page-tables.php
。
<?php
/*
Template Name: Tables
*/
get_header();
$meta = get_post_meta();
$name = ( isset( $meta['nameTxt'][0] ) && '' !== $meta['nameTxt'][0] ) ? $meta['nameTxt'][0] : '';
$branch = ( isset( $meta['branchTxt'][0] ) && '' !== $meta['branchTxt'][0] ) ? $meta['branchTxt'][0] : '';
$sem = ( isset( $meta['semTxt'][0] ) && '' !== $meta['semTxt'][0] ) ? $meta['semTxt'][0] : '';
$subject = ( isset( $meta['subTxt'][0] ) && '' !== $meta['subTxt'][0] ) ? $meta['subTxt'][0] : '';
$time_from = ( isset( $meta['timeFromTxt'][0] ) && '' !== $meta['timeFromTxt'][0] ) ? $meta['timeFromTxt'][0] : '';
$time_to = ( isset( $meta['timeToTxt'][0] ) && '' !== $meta['timeToTxt'][0] ) ? $meta['timeToTxt'][0] : '';
?>
<table width="350px" border="1">
<tr>
<td>
<?php esc_html_e( 'Your Name', 'your_theme_slug' ); ?>
</td>
<td>
<input type="text" value="<?php echo esc_attr( $name ); ?>" name="nameTxt">
</td>
</tr>
</table>
<input type="button" class="add_row_button" value="<?php esc_attr_e( 'Add Row', 'your_theme_slug' ); ?>"/>
<table id="dataTable" width="350px" border="1">
<tr>
<td>
<input type="button" class="delete_row_button" value="<?php esc_attr_e( 'Delete', 'your_theme_slug' ); ?>">
</td>
<td class="row_no">1</td>
<td>
<?php esc_html_e( 'Branch', 'your_theme_slug' ); ?>
</td>
<td>
<input type="text" value="<?php echo esc_attr( $branch ); ?>" name="branchTxt">
</td>
<td><?php esc_html_e( 'Sem', 'your_theme_slug' ); ?></td>
<td>
<input type="text" value="<?php echo esc_attr( $sem ); ?>" name="semTxt">
</td>
<td><?php esc_html_e( 'Subject', 'your_theme_slug' ); ?></td>
<td>
<input type="text" value="<?php echo esc_attr( $subject ); ?>" name="subTxt">
</td>
<td><?php esc_html_e( 'Time From', 'your_theme_slug' ); ?></td>
<td>
<input type="text" value="<?php echo esc_attr( $time_from ); ?>" name="timeFromTxt">
</td>
<td><?php esc_html_e( 'Time To', 'your_theme_slug' ); ?></td>
<td>
<input type="text" value="<?php echo esc_attr( $time_to ); ?>" name="timeToTxt">
</td>
</tr>
</table>
<?php get_footer();
希望对你有所帮助。