我的transactions收藏中有以下文档。

{txnId: 1, amount: 200, tags:["monthly", "recharge"]},
{txnId: 2, amount: 4000, tags:["monthly", "salary"]},
{txnId: 3, amount: 1000, tags:["monthly", "waterbill"]},
{txnId: 4, amount: 400, tags:["monthly", "electricity"]},
{txnId: 5, amount: 300, tags:["dinner", "daily"]}

我想把所有月薪但没有薪水的文件都拿来
我尝试过的一些查询及其各自的输出:
问题1:
db.transactions.find({tags: {$elemMatch: {$in: ["monthly"], $nin: ["salary"]}}})

输出1:
{txnId: 1, amount: 200, tags:["monthly", "recharge"]}
{txnId: 2, amount: 4000, tags:["monthly", "salary"]}
{txnId: 3, amount: 1000, tags:["monthly", "waterbill"]}
{txnId: 4, amount: 400, tags:["monthly", "electricity"]}

问题2:
db.transactions.find({tags: {$nin: ["salary"]}})

产出2:
{txnId: 1, amount: 200, tags:["monthly", "recharge"]}
{txnId: 3, amount: 1000, tags:["monthly", "waterbill"]}
{txnId: 4, amount: 400, tags:["monthly", "electricity"]}
{txnId: 5, amount: 300, tags:["dinner", "daily"]}

问题3:
db.transactions.find({tags: {$nin: ["salary"]}, tags: {$elemMatch: {$in: ["monthly"]}}})

产出3:
{txnId: 1, amount: 200, tags:["monthly", "recharge"]}
{txnId: 2, amount: 4000, tags:["monthly", "salary"]}
{txnId: 3, amount: 1000, tags:["monthly", "waterbill"]}
{txnId: 4, amount: 400, tags:["monthly", "electricity"]}

为什么$in和$nin不能一起工作,甚至$nin不能按预期工作?还是我误解了?

最佳答案

你也可以把$nin和$in一起使用。下面的查询将给出预期的记录。希望不用$elemmatch。

db.transactions.find({$and:[{tags:{$in:['monthly']}}, {tags:{$nin:['salary']}}]}).toArray()

输出:
[
{txnId: 1, amount: 200, tags:["monthly", "recharge"]},
{txnId: 3, amount: 1000, tags:["monthly", "waterbill"]},
{txnId: 4, amount: 400, tags:["monthly", "electricity"]}
]

09-25 17:15