Mongodb 基于对象数组的MondoDB滤波器

Mongodb 基于对象数组的MondoDB滤波器,mongodb,mongodb-query,nosql,Mongodb,Mongodb Query,Nosql,我收集了以下类型的数据: { “_id”:{ $oid:“6014662b3a38ba4929b602ab” }, “收藏”:[ { “名称”:“设施”, “_id”:{ $oid:“601466293a38ba4929b602aa” }, “是否已删除”:false }, { “名称”:“用户”, “_id”:{ $oid:“60021529c02fa2b27e7c1989” }, “是否已删除”:false }, { “名称”:“资产”, “_id”:{ $oid:“6018948fc35a

我收集了以下类型的数据:

{
“_id”:{
$oid:“6014662b3a38ba4929b602ab”
},
“收藏”:[
{
“名称”:“设施”,
“_id”:{
$oid:“601466293a38ba4929b602aa”
},
“是否已删除”:false
},
{
“名称”:“用户”,
“_id”:{
$oid:“60021529c02fa2b27e7c1989”
},
“是否已删除”:false
},
{
“名称”:“资产”,
“_id”:{
$oid:“6018948fc35a109224439f73”
},
},
{
“名称”:“资产”,
“_id”:{
$oid:“604a734fca10c74d800031db”
},
“是否已删除”:真
}
],
“客户”:“测试客户”,
“是否已删除”:false
}
我还有一个疑问


db.getCollection(“Collection”).aggregate([{
“$match”:{
“$and”:[{
'collection.name':'User',
“集合id”:ObjectId('60021529c02fa2b27e7c1989'),
“集合已删除”:false
}, {
'集合.名称':'资产',
“集合id”:ObjectId('604a734fca10c74d800031db'),
“集合已删除”:false
}],
'客户':'测试客户',
'is_deleted':false
}
}])
是否已删除
资产上的
在数据库中为true,但当值为
false
时,我正在请求


执行此查询时,不应返回任何数据,但它会返回。我一直在尝试解决此问题,但到目前为止没有任何帮助。

因为您正在尝试匹配数组中的元素,所以应该改用
$elemMatch
。此外,不需要使用
$和
运算符

db.collection.aggregate([
  {
    "$match": {
      "collection": {
        "$elemMatch": {
          "name": "User",
          "_id": ObjectId("60021529c02fa2b27e7c1989"),
          "is_deleted": false
        }
      },
      "collection": {
        "$elemMatch": {
          "name": "Asset",
          "_id": ObjectId("604a734fca10c74d800031db"),
          "is_deleted": false
        }
      },
      "customer": "TestCustomer",
      "is_deleted": false
    }
  }
])

游乐场:

为什么您认为您的查询不应该返回任何数据?@codemonkey,因为数据库中删除了请求的具有_id
604a734fca10c74d800031db
的资产。当数组中的两个值都已
被删除时,我会发出请求。它就像一个符咒。你帮我省去了很多头痛。谢谢大家!@我很高兴这有帮助。