Mos*_*ama 3 javascript mongoose mongodb node.js mongodb-query
所以基本上我有一个愿望清单,我有一堆产品,我想使用放置请求将它们添加到愿望清单产品数组中(顺便说一句,我正在使用邮递员)。这是愿望清单模式,是的,我知道数据库中的文档名称是“愿望清单”……我讨厌拼写错误
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = mongoose.Schema.Types.ObjectId;
var whishList = new Schema({
title: {type: String, default: "Cool whishlist"},
products:[{type: ObjectId, ref:'Product'}]
});
module.exports = mongoose.model('WhishList', whishList);
Run Code Online (Sandbox Code Playgroud)
这是产品架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var product = new Schema({
title: String,
price: Number,
likes: {type: Number, default: 0}
});
module.exports = mongoose.model('Product', product);
Run Code Online (Sandbox Code Playgroud)
现在这是我试图运行的代码
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/swag-shop');
var Product = require('./model/product');
var wishList = require('./model/wishlist');
app.put('/wishlist/product/add', function(request, response){
Product.find({_id: request.body.productId}, function(err, product){
if(err) {
response.status(500).send({err: "could not add item to wishlist"});
}else{
wishList.update({_id: request.body.wishlistId},{$addToSet: {products: product._id}}, function(err, wishlist){
if(err){
response.status(500).send({err: "could not add item to wishlist /update/"});
}else{
response.send(wishlist);
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
我真的看不出问题出在哪里我尝试删除文档并再次发布,但我遇到了同样的问题。提前致谢
问题是,Product.find()如果查询匹配集合中的任何文档而不是您想要的单个文档,则结果来自Mongoose 文档数组。
因此表达式{$addToSet: {products: product._id}}解析为{$addToSet: {products: undefined}}因为product是一个数组product._id且未定义。拿这个简单的例子
var product = [{ '_id': 1 }];
console.log(product._id) // logs undefined
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,你可以访问数组中的唯一元素
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product[0]._id} },
function(err, wishlist) { ... }
);
Run Code Online (Sandbox Code Playgroud)
或者使用findOne()查询产品时返回单个文档的方法:
Product.findOne({ '_id': request.body.productId }, function(err, product) {
if(err) {
response.status(500).send({err: "could not add item to wishlist"});
} else {
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product._id } },
function(err, wishlist) { ... }
);
}
});
Run Code Online (Sandbox Code Playgroud)
该findById()方法在这种情况下也很有用,即
Product.findById(request.body.productId, function(err, product) {
if(err) {
response.status(500).send({err: "could not add item to wishlist"});
} else {
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product._id } },
function(err, wishlist) { ... }
);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |