提问者:小点点

node js javascript中的map.get()在从mongodb获取数据时总是返回未定义的


我在这里使用的是一个映射,我在其中存储了id:quantity pair我想将这个数量添加到每个产品数组(包含对象)中,并且我正在通过map.get(id)方法获取这个数量,尽管id的类型和传递到get函数中的id具有相同的值和数据类型,但是我没有定义,我尝试验证了map和传递的id中id的类型和值,两者都是相同的。但是问题仍然存在

这是错误的代码,实际上我是通过这个函数返回一个承诺

var cartMap = new Map();
for (let i = 0; i < this.cart.items.length; i++) {
    const e = this.cart.items[i];
    cartMap.set(mongodb.ObjectId(e._id), e.quantity);
}
db.collection("products").find({ _id: { $in: [...productIds] } }).toArray().then((products) => {
    console.log(cartMap);
    let newProd = products.map(prod => {
        console.log(cartMap.get(prod._id)); // returns undefined
        prod.quantity = cartMap.get(prod._id);
        // cartMap.set(prod._id, -1);
        return prod;
    })
    console.log(newProd);
    if (productIds.length > products.length) {
        let garbageCart = cartMap.keys().filter(prod => {
            if (cartMap.get(prod) != -1) {
                return prod;
            }
        })
        garbageCart.sort();
        this.cart.items.sort();
        let i = 0;
        let updatedCart = this.cart.items.filter(prod => {
            if (i >= garbageCart.length) {

            }
            else if (prod._id == garbageCart[i]) {
                i++;
            }
            else {
                return prod;
            }
        })
        db.collection("users").updateOne({ _id: this.id }, {
            $set: { cart: updatedCart }
        })
    }
    resolve(newProd);

控制台消息

Map(2) { 608c49bca4d1ed0bfc8c41fb => 1, 608c4a41a4d1ed0bfc8c41ff => 1 }
undefined
undefined
[
  {
    _id: 608c49bca4d1ed0bfc8c41fb,
    title: 'chhole bhature',
    description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',   
    price: '1000',
    imageurl: 'imageurl',
    userId: null,
    quantity: undefined
  },
  {
    _id: 608c4a41a4d1ed0bfc8c41ff,
    title: 'hat',
    description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',   
    price: '478',
    imageurl: 'imageurl',
    userId: null,
    quantity: undefined
  }
]

共1个答案

匿名用户

这是因为mongodb.objectid(e._id)prod._id是对内存中两个不同位置的引用,因此它们不会相互比较为相等--尽管我知道这些位置上可用的对象表示相同的objectid

为了说明这一点:

var map = new Map()
// object1 and object2 represent the same object, but point to different locations in memory
var object1 = createObject()
var object2 = createObject()

map.set(object1, "some value")

console.log(map.get(object1))   // output: "some value"
console.log(map.get(object2))   // output: undefined

function createObject() {
    return {
        key: "value"
    }
}

您可以使用这些对象字符串表示作为映射的键--通过使用它们的objectid.toString()方法转换它们。由于它们是值类型(而不是引用类型),表示相同字符序列的字符串将相互比较为相等。