首页 > 解决方案 > 如何使用具有一对属性的 $in 运算符

问题描述

考虑这个集合

/* 1 */
{
    "key" : 1,
    "b" : 2,
    "c" : 3
}

/* 2 */
{
    "key" : 2,
    "b" : 5,
    "c" : 4
}

/* 3 */
{
    "key" : 3,
    "b" : 7,
    "c" : 9
}

/* 4 */
{
    "key" : 4,
    "b" : 7,
    "c" : 4
}

/* 5 */
{
    "key" : 5,
    "b" : 2,
    "c" : 9
}

我想使用 $in 运算符并编写一个查询来返回文档,例如 (b, c) IN ((2, 3), (7, 9))。它的意思是“同时返回 b 为 2 且 c 为 3 的所有行,或者 b 为 7 且 с 为 9 的所有行”。

如何使用 $in 运算符来使用多个属性值。

如果我使用以下查询

db.getCollection('test').find({
    $and:[

           {b:{$in:[2,7]}},
           {c:{$in:[3,9]}}
         ]
    })

然后我得到以下结果

(2,3)

(7,9)

(2,9) --> 这是不需要的记录。

在 SQL 世界中,可以 SELECT * FROM demo WHERE (b, c) IN ((2, 3), (7, 9))

Mongo DB 中的等价物是什么?

标签: mongodbmongodb-queryaggregation-framework

解决方案


如果我做对了,那么您正在做的就是获得所有对 (2,3),(2,9),(7,3),(7,9)。但是你想一一匹配,所以你的有效对应该是 (2, 3), (7, 9)。为了满足这一点,您可以将 b 和 c 一个一个匹配,然后将它们配对并“或”它们。

db.getCollection('test').find({
$or: [
       {$and: [ {b : 2}, {c : 3} ]},
       {$and: [ {b : 7}, {c : 9} ]}
     ]
})

推荐阅读