mongodb同时使用AND和OR查询

4dbbbstv  于 2023-04-05  发布在  Go
关注(0)|答案(5)|浏览(286)

我可以在mongodb查询中使用OR和AND的组合吗?
下面的代码不按预期工作

db.things.find({
           $and:[
                {$or:[
                     {"first_name" : "john"}, 
                     {"last_name" : "john"}
                ]},
                {"phone": "12345678"}
            ]});

数据库内容:

> db.things.find();
{ "_id" : ObjectId("4fe8734ac27bc8be56947d60"), "first_name" : "john", "last_name" : "hersh", "phone" : "2222" }
{ "_id" : ObjectId("4fe8736dc27bc8be56947d61"), "first_name" : "john", "last_name" : "hersh", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8737ec27bc8be56947d62"), "first_name" : "elton", "last_name" : "john", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8738ac27bc8be56947d63"), "first_name" : "eltonush", "last_name" : "john", "phone" : "5555" }

当查询上面的查询时-我什么也没有得到!

> db.things.find({$and:[{$or:[{"first_name" : "john"}, {"last_name" : "john"}]},{"phone": "12345678"}]});
>

我用的是mongo1.8.3

qcuzuvrc

qcuzuvrc1#

db.things.find({
    $and: [
        {
            $or: [
                {"first_name": "john"},
                {"last_name": "john"}
            ]
        },
        {
            "Phone": "12345678"
        }
    ]
})

AND接受2个表达式的数组OR,phone。
OR接受2个表达式first_name,last_name的数组。

*

  • 电话号码。

注意:如果这不起作用,请升级到最新版本的MongoDB。

sulc1iza

sulc1iza2#

使用隐式AND运算的缩写:

db.things.find({
    $or : [ 
        {"first_name": "john"},
        {"last_name": "john"}
    ],
    "phone": "12345678"         
})
zpgglvta

zpgglvta3#

这可以通过以下方式实现(mongodb3.4)
这是一个很好的例子
https://docs.mongodb.com/manual/reference/operator/query/and/#and-queries-with-multiple-expressions-specifying-the-same-operator

db.getCollection('tbl_menu_items').find({
        $and : [
            { $or : [ { price : 0.99 }, { price : 1.99 } ] },
            { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
        ]
    } )

此查询将选择所有文档,其中:
价格字段值等于0.99或1.99,销售字段值等于真或数量字段值小于20。
下面是$和条件与$或查询的示例,即匹配任何条件,例如
考虑以下查询...

db.getCollection('tbl_menu_items').find(

        { '$or': 
           [ { '$and': 
                [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553")  ] } },
                  { is_ryward: 1 },
                  { points_reqiured_to_redeem_reward: { '$lte': 500 } } ] },
             { '$and': 
                [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553")  ] } },
                  { is_freebie: 1 } ] } ] }
        )

此查询将选择所有文档,其中:
位置数组在588054 c63879 f2 e767 a1 d553和is_ryward = 1和points_reqiured_to_redeem_reward〈500
或者
位置数组在588054 c63879 f2 e767 a1 d553和is_freebie

7z5jn7bk

7z5jn7bk4#

我相信只有MongoDB v2.0+支持$和。我很惊讶控制台首先接受了表达式。我将尝试在我拥有的1.8服务器上重新创建。
还可以查看$and的10 Gen高级查询文档。

  • 最新情况 *

我将您的示例数据输入到v1.8x和v2.0x MongoDB服务器中。查询在v2.0x上工作,在v1.8x上失败。这证实了我(和Miikka)的怀疑,即问题出在$and和您的服务器版本上。
我在Web here上找到了一个(可以说)聪明的变通方法。我希望这能有所帮助。
-SethO

8aqjt8rx

8aqjt8rx5#

你可以这样写你的查询:

const query = {};
query['phone'] = '12345678';
query['$or'] = [
  { "first_name": "john" },
  { "last_name": "john" }
];
db.things.find(query);

相关问题