使用WHERE和IN子句的MongoDB查询

时间:2019-07-22 06:53:41

标签: mysql sql mongodb sails-mongo

我需要从mongodb similer到以下sql查询中获取数据:

select * from ar_pages where (slug='ettarc' or id in ('1','2','3','4'))

其中一种使用搜索条件,另一种使用带有IN子句的条件(获取具有指定子标签的页面和具有ID列表的页面)

我正在使用 Node Sails 框架:我已经尝试过以下代码:但不会给出预期的结果

let listing = await Mymodel.find({
   $or: [{
      id: {
        $in: ['5cxxxx90xxxx2e23xxxxxxxx', '5cxxxx18xxxx2e81xxxxxxxx']
      }
   }, {
      user_id: 'xxxxxxxxx'
   }]
});

上面的代码在执行时返回以下错误:

MongoError: $or must be an array

Mongo DB文档样本:

{
    "_id" : ObjectId("5d286f93c04a685616627095"),
    "title" : "My First Page",
    "description" : "My First Page Contents",
    "user_id" : "5c80f410c1b9eb3d8fbf541c",
    "status" : "active",
    "createdAt" : 1562931091686.0,
    "updatedAt" : 1563528420160.0,
    "is_imported" : false,
    "background_img" : "",
    "background_color" : "",
    "logo" : "",
    "media_map" : null
}

2 个答案:

答案 0 :(得分:1)

尝试一下

db.ar_pages.find({

    "$or": [{
        "slug" : 'ettarc' 
    },{ "id": {"$in":  ['1','2','3','4']}
    }]
});

答案 1 :(得分:1)

您的查询试图匹配_id,而没有ObjectId()换行。您需要将其包装起来,然后在$in

中使用它
db.ap_pages.find({
    $or: [{
        _id: {
            $in: [ObjectId('5d3595d9022a3de52f62ce79'), ObjectId('5d3595d9022a3de52f62ce7d')]
        }
    }, {
        user_id: '5c80f410c1b9eb3d8fbf541d'
    }]
});

要使用Mongoose查找该文档,您必须在ap_pages的架构中将_id定义为:

_id: { type: String }

并简单地使用它

db.ap_pages.find({
        $or: [{
            _id: {
                $in: ['5d3595d9022a3de52f62ce79', '5d3595d9022a3de52f62ce7d']
            }
        }, {
            user_id: '5c80f410c1b9eb3d8fbf541d'
        }]
    });