$addToSet 到一个数组,但它给了我 null

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)

我真的看不出问题出在哪里我尝试删除文档并再次发布,但我遇到了同样的问题。提前致谢

chr*_*dam 5

问题是,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)