【问题标题】:Finding a particular object in an array mongoDB在数组 mongoDB 中查找特定对象
【发布时间】:2017-05-31 23:34:37
【问题描述】:

我有一个由一些字符串、对象和一个数组组成的集合。该数组中有几个对象。我正在尝试删除对象 ID 为 ObjectId("587ec66e5ed5cb0061092dbe") 的所有订单。有关架构和相关数据,请参见下文。天底下我什么都试过了。

var campgroundSchema = new mongoose.Schema({
   name: String,
   image: String,
   description: String,
   price: String,
   author: {
      id: {
         type: mongoose.Schema.Types.ObjectId,
         ref: "User"
      },
      username: String
   },
   orders: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "Order"
      }
   ]
});

以下是示例数据。

{ 
    "_id" : ObjectId("587ec65e5ed5cb0061092dbd"), 
    "name" : "is Forrest Cool?", 
    "price" : "", 
    "image" : "https://dsafd.com", 
    "description" : "", 
    "orders" : 
    [ 
        ObjectId("587ec66e5ed5cb0061092dbe"), 
        ObjectId("587ec6bc5ed5cb0061092dc0"), 
        ObjectId("587ec6c05ed5cb0061092dc2"), 
        ObjectId("587ec7178f628931610636dc"), 
        ObjectId("587ec71e8f628931610636de")
    ], 
    "author" : { "id" : ObjectId("587ec6145ed5cb0061092dbc"), 
    "username" : "forrest" }, 
    "__v" : 18 
}

非常感谢。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    要在orders 数组中查找具有特定ObjectId 的特定元素,可以使用$in

    试试这个:

    //orderObjectId is the object id you want to find inside orders.
    Campground.find({orders : {$in : [orderObjectId]}},{'orders.$':1},function(err,result){
    ...
    });
    

    'orders.$':1 将只返回订单数组中的那个元素

    要删除该特定订单,

    //_id is optional, you can query using orderID also.
    Campground.update({ 
        _id :someObjectId, orders : {$in : [orderObjectId]}
    },{
        $pull : {order : orderObjectId}
    },function(err,result){
                         ...
    });
    

    更新: 根据您的评论,您似乎在使用它时遇到了问题。

    试试这个:

    //if you are receiving orderId as string, convert string to ObjectId
    var orderId = mongoose.Schema.Types.ObjectId("587d78b8e898d1e732b3888a");
    
    Campground.find({"orders": {$in : [orderId]}},function(err, result){ 
       if(err){ 
           console.log(err); 
       } else { 
           console.log("FOUND RESULT: " + result); 
       } 
    });
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,拉维。但是,我仍然无法弄清楚。如您所知,我是 node/js/mongo 的新手。您能否提供一些我可以轻松复制并粘贴到我的代码中的内容,看看是否有帮助。我正在寻找 objectId 为“587d78b8e898d1e732b3888a”的订单。
    • 您面临的问题是什么?
    • Campground.find({"orders._id":"587d78b8e898d1e732b3888a"}, function(err, result){ if(err){ console.log(err); } else { console.log( "找到结果:" + 结果); } });
    • 有什么问题?
    • 请不要使用简单的字符串查询ObjectId,会报错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2016-01-30
    • 2020-08-30
    • 2014-12-04
    • 2016-07-26
    相关资源
    最近更新 更多