2013-08-08 33 views
5

Tôi đang cố tạo truy vấn mongo sẽ trả về kết quả trong đó tất cả các mảng có phần tử cụ thể được đặt thành false.Mongo - Truy vấn mảng, chỉ tìm thấy nơi tất cả các phần tử khớp với

Một kỷ lục ví dụ dữ liệu: -

images: [ 
    { 
     id: ObjectId("516bef7fc05e877b31000000"), 
     primary: true 
    }, 
    { 
     id: ObjectId("516bef2ac05e879622000000"), 
     primary: false 
    }, 
    { 
     id: ObjectId("516beeb7c05e879e2a000000"), 
     primary: false 
    } 
], 
name: "test", 
etc: "etc" 

Tôi chỉ muốn tìm các tài liệu mà tất cả các lĩnh vực chính được thiết lập để sai tuy nhiên thông thường (không sử dụng bộ chọn truy vấn hoặc elemMatch) Mongo sẽ trở lại tài liệu này vì ít nhất 1 của các phần tử mảng khớp với nhau.

Làm cách nào để làm cho Mongo chỉ trả lại tài liệu mà tất cả chúng khớp với thông số tìm kiếm của tôi?

Rất cám ơn.

Trả lời

4

Bạn có thể làm điều này với các khuôn khổ hợp khá dễ dàng:

db.so.aggregate([ 
    { $unwind: "$images" }, 
    { $group: { 
     _id: '$_id', 
     all: { $sum: 1 }, 
     all_primary: { $sum: { $cond: [ { $eq: [ '$images.primary', true ] }, 1, 0 ] } }, 
     images: { $push: '$images' }, 
     name: { $first: '$name' }, 
     etc: { $first: '$etc' }, 
    } }, 
    { $project: { 
     _id: 1, 
     images: 1, 
     name: 1, 
     etc: 1, 
     same: { $cond: [ { $eq: [ '$all', '$all_primary' ] }, 1, 0 ] } 
    } }, 
    { $match: { 'same' : 1 } } 
]); 

Với điều này như là đầu vào:

{ 
    "_id" : ObjectId("5203730bf8eaa52a846ebc3e"), 
    "images" : [ 
     { 
      "id" : ObjectId("516bef7fc05e877b31000000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516bef2ac05e879622010000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516beeb7c05e879e2a000010"), 
      "primary" : true 
     } 
    ], 
    "name" : "Derick", 
    "Etc" : true 
} 
{ 
    "_id" : ObjectId("52037315f8eaa52a846ebc3f"), 
    "images" : [ 
     { 
      "id" : ObjectId("516bef7fc05e877b31000000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516bef2ac05e879622010000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516beeb7c05e879e2a000020"), 
      "primary" : false 
     } 
    ], 
    "name" : "James", 
    "Etc" : true 
} 
{ 
    "_id" : ObjectId("520373621a78238235b6ffbf"), 
    "images" : [ 
     { 
      "id" : ObjectId("516bef7fc05e877b31000000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516bef2ac05e879622010000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516beeb7c05e879e2a000020"), 
      "primary" : false 
     } 
    ], 
    "name" : "James", 
    "etc" : true 
} 
{ 
    "_id" : ObjectId("5203736b1a78238235b6ffc0"), 
    "images" : [ 
     { 
      "id" : ObjectId("516bef7fc05e877b31000000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516bef2ac05e879622010000"), 
      "primary" : true 
     }, 
     { 
      "id" : ObjectId("516beeb7c05e879e2a000020"), 
      "primary" : true 
     } 
    ], 
    "name" : "James", 
    "etc" : true 
} 

này kết quả đầu ra:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("5203736b1a78238235b6ffc0"), 
      "images" : [ 
       { 
        "id" : ObjectId("516bef7fc05e877b31000000"), 
        "primary" : true 
       }, 
       { 
        "id" : ObjectId("516bef2ac05e879622010000"), 
        "primary" : true 
       }, 
       { 
        "id" : ObjectId("516beeb7c05e879e2a000020"), 
        "primary" : true 
       } 
      ], 
      "name" : "James", 
      "etc" : true, 
      "same" : 1 
     }, 
     { 
      "_id" : ObjectId("5203730bf8eaa52a846ebc3e"), 
      "images" : [ 
       { 
        "id" : ObjectId("516bef7fc05e877b31000000"), 
        "primary" : true 
       }, 
       { 
        "id" : ObjectId("516bef2ac05e879622010000"), 
        "primary" : true 
       }, 
       { 
        "id" : ObjectId("516beeb7c05e879e2a000010"), 
        "primary" : true 
       } 
      ], 
      "name" : "Derick", 
      "etc" : null, 
      "same" : 1 
     } 
    ], 
    "ok" : 1 
} 
+0

Cảm ơn bạn Derick, hoạt động tốt. – user1954882

-1

Giả Images là một tài liệu mà bạn có thể sử dụng (từ vỏ):

db.images.find ({ 'chính': 'false'})

Nếu hình ảnh là một đối tượng:

db.mydoc.find ({ 'hình ảnh': { 'chính': 'false'}})

+0

'db.articles.find ({'images.primary': false})' thực hiện những gì tôi mô tả ở trên, sẽ trả về tài liệu nếu chỉ một trong các phần tử mảng khớp với nhau. 'db.articles.find ({'images': {'primary': false}})' không trả về gì cả. – user1954882

3

Nó sẽ không thể đơn giản hơn nhiều để loại trừ tất cả các tài liệu mà images có chính: yếu tố đúng không?

{ "images" : 
{ "$not" : 
    {"$elemMatch" : { "primary" : true }} 
} 
} 

Đương nhiên, điều này chỉ áp dụng cho trường lồng nhau boolean, như trong trường hợp này.

Các vấn đề liên quan