MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongoose chọn các trường phụ

Đây là cách MongoDB xử lý phép chiếu cơ bản với các phần tử mảng. Trong khi bạn có thể làm điều gì đó như sau:

Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {

})

Và điều đó sẽ chỉ trả về trường "phiếu tán thành" từ bên trong tài liệu con của mảng nhận xét cho tất cả các tài liệu phù hợp với điều kiện và tất cả các phần tử của mảng, tất nhiên, bạn không thể kết hợp trường này với phép chiếu vị trí đã chọn bằng cách sử dụng vị trí $ nhà điều hành. Điều này về cơ bản bắt nguồn từ "lý thuyết" điều đó nói chung bạn thực sự muốn trả về toàn bộ mảng. Vì vậy, đây là cách nó luôn hoạt động và không có khả năng thay đổi sớm.

Để có được những gì bạn muốn, bạn cần có các khả năng mở rộng để thao tác tài liệu được cung cấp bởi khung tổng hợp . Điều này cho phép bạn kiểm soát nhiều hơn cách trả lại tài liệu:

Model.aggregate(
    [
        // Match the document containing the array element
        { "$match": { "comments._id" : oid } },

        // Unwind to "de-normalize" the array content
        { "$unwind": "$comments" },

        // Match the specific array element
        { "$match": { "comments._id" : oid } },

        // Group back and just return the "upvotes" field
        { "$group": {
            "_id": "$_id",
            "comments": { "$push": { "upvotes": "$comments.upvotes" } }
        }}
    ],
    function(err,docs) {


    }
);

Hoặc trong các phiên bản hiện đại của MongoDB kể từ 2.6, bạn thậm chí có thể làm điều này:

Model.aggregate(
    [
        { "$match": { "comments._id" : oid } },
        { "$project": {
            "comments": {
                "$setDifference": [
                    { "$map": {
                        "input": "$comments",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el._id", oid ] },
                                { "upvotes": "$$el.upvotes" },
                                false
                            ]
                        }
                    }},
                    [false]
                ]
            }}
        }}
    ],
    function(err,docs) {

    }
)

Và điều đó sử dụng $map $setDifference toán tử để thực hiện lọc "nội dòng" nội dung mảng mà không cần xử lý trước $unwind sân khấu.

Vì vậy, nếu bạn muốn kiểm soát nhiều hơn cách tài liệu được trả lại, thì khung tổng hợp là cách để thực hiện khi làm việc với các tài liệu nhúng.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Thủ tục được lưu trữ trong MongoDB

  2. Có hỗ trợ trình điều khiển mongodb C # System.Dynamic.DynamicObject trong .NET 4 không?

  3. Làm thế nào để thực hiện hiệu quả việc phân biệt với nhiều khóa?

  4. truy vấn mongodb với cả AND và OR

  5. DB-ref trong mongoose mà không có Schema.ObjectId?