【问题标题】:mongodb ObjectId find with sails, returns all the datamongodb ObjectId 用sails查找,返回所有数据
【发布时间】:2017-09-01 07:22:33
【问题描述】:

在我的风帆控制器中,我实现了一个查找用户的功能。但是当我尝试使用 ObjectId 进行搜索时,它会返回所有数据。我找不到任何理由。但是当我创建一个新的单独字段作为“userID”并使用“userID”查找时它会起作用。我认为问题是使用“ObjectId”找到可能的问题。

module.exports = {

    updateOrders : function(req,res){

    var ObjectId = require('mongodb').ObjectID;
    console.log("req " + req);
    var data = req.body;
    var obj = [];


console.log("\ndata "+(data));

var jdata = JSON.stringify(data);
console.log("\njdata: "+jdata);

    data.forEach(function(orders){

        var objid = ObjectId(orders.id);
        console.log("Obj orders id  :" + objid);


        ApplicationOrder.find({id: ObjectId(orders.id)}).exec(function (err, order) {

            if (err){
                return done(err);
            }

            console.log('order ' + order);
             obj.push(order);
        });


    })
        res.send(obj);




        }


};

Json 数据:在控制台打印。

{
    "_id" : ObjectId("59a8f820caf1cae37af72c0c"),
    "appId" : "59a669431954a69e37c20b69",
    "registeredUser" : "59a677811954a69e37c20b73",
    "item" : [ 
        {
            "id" : "59a669441954a69e37c20b70",
            "name" : "Short x",
            "qty" : 1,
            "sku" : "1111",
            "totWeight" : null,
            "price" : "250",
            "total" : "250",
            "imgURL" : [ 
                {
                    "img" : "short_x.png"
                }
            ],
            "totalQty" : 218
        }
    ],
    "amount" : "250",
    "customerName" : "dilakshan",
    "deliverName" : "dilakshan",
    "deliveryNo" : "11010",
    "deliveryStreet" : "delgoda",
    "deliveryCity" : "kandana",
    "deliveryCountry" : "Sri Lanka",
    "deliveryZip" : "11010",
    "telNumber" : 94779967409,
    "tax" : "0",
    "shippingCost" : "0",
    "shippingOpt" : "Flat Rate",
    "email" : "s.dilakshan@yahoo.com",
    "currency" : "$",
    "paymentStatus" : "Pending",
    "fulfillmentStatus" : "Pending",
    "createdAt" : ISODate("2017-09-01T06:03:12.584Z"),
    "updatedAt" : ISODate("2017-09-01T06:03:12.584Z")
}
{
    "_id" : ObjectId("59a8f82fcaf1cae37af72c0d"),
    "appId" : "59a669431954a69e37c20b69",
    "registeredUser" : "59a677811954a69e37c20b73",
    "item" : [ 
        {
            "id" : "59a669441954a69e37c20b6d",
            "name" : "Shirt x",
            "qty" : 1,
            "sku" : "1111",
            "totWeight" : null,
            "price" : "250",
            "total" : "250",
            "imgURL" : [ 
                {
                    "img" : "shirt_x.png"
                }
            ],
            "totalQty" : 244
        }
    ],
    "amount" : "250",
    "customerName" : "dilakshan",
    "deliverName" : "dilakshan",
    "deliveryNo" : "11010",
    "deliveryStreet" : "delgoda",
    "deliveryCity" : "kandana",
    "deliveryCountry" : "Sri Lanka",
    "deliveryZip" : "11010",
    "telNumber" : 94779967409,
    "tax" : "0",
    "shippingCost" : "0",
    "shippingOpt" : "Flat Rate",
    "email" : "s.dilakshan@yahoo.com",
    "currency" : "$",
    "paymentStatus" : "Pending",
    "fulfillmentStatus" : "Pending",
    "createdAt" : ISODate("2017-09-01T06:03:27.022Z"),
    "updatedAt" : ISODate("2017-09-01T06:03:27.022Z")
}
{
    "_id" : ObjectId("59a8f83ecaf1cae37af72c0e"),
    "appId" : "59a669431954a69e37c20b69",
    "registeredUser" : "59a677811954a69e37c20b73",
    "item" : [ 
        {
            "id" : "59a669441954a69e37c20b71",
            "name" : "Beach Suit",
            "qty" : 2,
            "sku" : "1111",
            "totWeight" : null,
            "price" : "250",
            "total" : "250",
            "imgURL" : [ 
                {
                    "img" : "cloth3.png"
                }
            ],
            "totalQty" : 238
        }
    ],
    "amount" : "500",
    "customerName" : "dilakshan",
    "deliverName" : "dilakshan",
    "deliveryNo" : "11010",
    "deliveryStreet" : "delgoda",
    "deliveryCity" : "kandana",
    "deliveryCountry" : "Sri Lanka",
    "deliveryZip" : "11010",
    "telNumber" : 94779967409,
    "tax" : "0",
    "shippingCost" : "0",
    "shippingOpt" : "Flat Rate",
    "email" : "s.dilakshan@yahoo.com",
    "currency" : "$",
    "paymentStatus" : "Pending",
    "fulfillmentStatus" : "Pending",
    "createdAt" : ISODate("2017-09-01T06:03:42.439Z"),
    "updatedAt" : ISODate("2017-09-01T06:03:42.439Z")
}

【问题讨论】:

  • 您能否更清楚地了解您的代码的功能以及您期望它做什么?您提到控制器操作应该“查找用户”,我看到查询的每个 ApplicationOrder 行都返回了 registeredUser ID。期望的行为与此不同吗?
  • registeredUser ID 用于登录的特定用户。注册时用户与用户的 ID 会有所不同。在此标准中,它对于选定的产品也具有唯一的 id。问题是当我使用 ObjectId 查找特定数据时,它会返回所有其他数据。
  • 感谢您的更新!您是否尝试过像这样指定_idApplicationOrder.find({'_id': orders. Id})...?还要记住,.find 以数组的形式返回(通过回调)结果,所以你的代码中的 order 真的是 orders

标签: angularjs mongodb sails.js sails-mongo


【解决方案1】:

对于标准sails.js/waterline 查询,您必须在查询参数中使用id 作为字符串,不要使用ObjectId(ordersId)

当您使用sails 原生查询时,请使用ObjectId(ordersId)

【讨论】:

  • 我试过它没有返回任何结果。但我能够打印我解析的“order.id”值。当我使用`{id:orders.id}` 时,它没有给我任何数据。当我只使用 ObjectId 时,它只返回一些数据。但它会返回所有其他数据。
  • 我猜orders是一个数组,是吗?您需要正确检索它,以便 id 是一个字符串或字符串数​​组。
  • 是的 order 是一个数组。事情是 .find 标准返回我的 mongodb 数据库中的所有对象。它没有返回我用 ObjectId 指定的对象。这就是我在控制台中作为 returned Objects 在我的函数中打印的内容。
  • 使用一次 findById(orders.id) 方法
  • 如果 orders 是一个对象数组,那么 orders.id 当然不起作用。您需要从每个对象中一个一个地检索 id 并将其放入一个新数组中。我正在使用 lodash: let orderIds = _.map(orders, 'id');
【解决方案2】:

如果您使用任何 mongodb 适配器,则不要尝试通过 ObjectId(orders.id) 转换 id。尝试正常查询,如

 ApplicationOrder.find({'id':orders.id})

对于原生sails查询,您必须将id转换为objectId。

【讨论】:

  • 我试过它没有返回任何结果。但我能够打印我解析的“order.id”值。当我使用` {id:orders.id}` 时,它没有给我任何数据。当我只使用 ObjectId 时,它只返回一些数据。但它返回所有其他数据。我也发现了一些东西。当我从解析的 JSON 数据中删除“id”数据字段时,它仍然返回所有对象。
  • ApplicationOrder.native(function(err, collection) { if (err) return res.serverError(err); collection.find({'_id':ObjectId(orders.id)}).toArray(function (err, results) { if (err) return res.serverError(err); console.log(results); return res.ok(results); }); }) 这段代码返回我 _TypeError: Argument must be a string _
  • 使用一次 findById(orders.id) 方法
【解决方案3】:

我终于能够解决这个问题。我不得不在sails 中编辑我的模型类并且只使用orders.id 模型类,

_id:{type : 'objectid'} 以及当搜索

.find({_id: orders.id})

这对我来说非常有效。

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 2014-11-09
    • 1970-01-01
    • 2019-09-22
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2020-09-12
    相关资源
    最近更新 更多