Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Cơ Sở Dữ Liệu

Dễ dàng lấy tất cả Key Names trong MongoDB Collection

Dễ dàng lấy tất cả Key Names trong MongoDB Collection

Để Validate Schema, Debug Typo trong Fields, hoặc tìm Fields không nên Set, bạn cần hiểu tất cả Keys trong MongoDB Collection.

Nhiều MongoDB-as-a-Service Companies cung cấp cách dễ dàng làm việc này ngay trên UI, bao gồm ObjectRocket. Người dùng MongoDB lâu năm thường bắt đầu với Object-Document Mapper (ODM), như Mongoose cho JS hoặc Mongoengine cho Python, để xây dựng Schema nhất quán cho App và giảm Typo. (ODMs cũng làm Type Validation, tránh vô tình để String vào Field Integer có Math Applied.)

Nếu không có Service hoặc ODM, có một vài phương pháp khác truy cập Keys. Dưới đây là những cách tốt nhất chúng tôi tìm được để lấy tất cả Keys trong MongoDB Collection cho các hoàn cảnh khác nhau.

Một ví dụ

DB.ACTIVITIES.INSERT({ TYPE : ['INDOOR', 'OUTDOOR', 'MIXED'] });
DB.ACTIVITIES.INSERT({ ACTIVITY : 'CYCLING' });
DB.ACTIVITIES.INSERT({ ACTIVITY : 'SKIING', LOCATION: 'ALPES' });
DB.ACTIVITIES.INSERT({ EQUIPMENT : ['PADDLES','SUNGLASSES'] });

Bạn muốn lấy Unique Keys:
TYPE, ACTIVITY, EQUIPMENT, LOCATION

MapReduce

Bạn có thể dùng MapReduce:

MR = DB.RUNCOMMAND({ "MAPREDUCE" : "ACTIVITIES", "MAP" : FUNCTION() { FOR (VAR KEY IN THIS) { EMIT(KEY, NULL); } }, "REDUCE" : FUNCTION(KEY, STUFF) { RETURN NULL; }, "OUT": "ACTIVITIES" + "_KEYS" })

Khi hoàn tất, chạy Distinct Command trên Collection kết quả để tìm tất cả Keys:

DB.ACTIVITIES_KEYS.DISTINCT("_ID")

Nếu muốn lấy danh sách Unique Keys trong Subdocument, chỉ sửa dòng:

FOR (VAR KEY IN THIS.FIRST_LEVEL.SECOND_LEVEL.NTH_LEVEL) { EMIT(KEY, NULL); }

Aggregation

Bạn cũng có thể dùng Aggregation. Phương pháp này hoạt động với tất cả Drivers hỗ trợ Aggregate Framework. Với Aggregations, $SAMPLE hoặc $LIMIT có thể dùng để giảm Overhead.

Lưu ý: Chạy với Primary Read Preference có thể ảnh hưởng Performance. Cân nhắc chạy với Secondary Read Preference.

Dùng Aggregation với $OBJECTTOARRAY (có từ version 3.4.4+) để chuyển tất cả Top Key-Value Pairs thành Document Arrays, tiếp theo $UNWIND và $GROUP với $ADDTOSET để lấy Distinct Keys toàn Collection.

$$ROOT để tham chiếu Top-level Document.

DB.ACTIVITIES.AGGREGATE([
  {"$PROJECT":{"ARRAYOFKEYVALUE":{"$OBJECTTOARRAY":"$$ROOT"}}},
  {"$UNWIND":"$ARRAYOFKEYVALUE"},
  {"$GROUP":{"_ID":NULL,"ALLKEYS":{"$ADDTOSET":"$ARRAYOFKEYVALUE.K"}}}
])

Lấy Keys trong một Document

Bạn cũng có thể dùng Aggregation lấy Keys trong một Document:

DB.ACTIVITIES.AGGREGATE([
  {"$PROJECT":{"ARRAYOFKEYVALUE":{"$OBJECTTOARRAY":"$$ROOT"}}},
  {"$PROJECT":{"KEYS":"$ARRAYOFKEYVALUE.K"}}
])

Mongo Shell

Bạn cũng có thể thử dưới Mongo Shell Client:

VAR ALLKEYS = {}; DB.YOURCOLLECTION.FIND().FOREACH(FUNCTION(DOC){OBJECT.KEYS(DOC).FOREACH(FUNCTION(KEY){ALLKEYS[KEY]=1})}); ALLKEYS;

Output Fields cho một Document

Nếu cần Output Fields cho một Document trong Collection (vì các Document khác có Keys hoàn toàn khác) dùng:

DOC=DB.THINKS.FINDONE(); FOR (KEY IN DOC) PRINT(KEY);

Python

Hoặc dùng Python. Trả về Set của tất cả Top-level Keys trong Collection:

#USING PYMONGO AND CONNECTION NAMED 'DB'
REDUCE( LAMBDA ALL_KEYS, REC_KEYS: ALL_KEYS | SET(REC_KEYS),
  MAP(LAMBDA D: D.KEYS(), DB.THINGS.FIND()), SET() )

JavaScript

Hoặc dùng JavaScript:

DB.COLLECTION('COLLECTIONNAME').MAPREDUCE(
  FUNCTION() { FOR (VAR KEY IN THIS) { EMIT(KEY, NULL); } },
  FUNCTION(KEY, STUFF) { RETURN NULL; },
  { "OUT": "ALLFIELDNAMES" },
  FUNCTION(ERR, RESULTS) {
    VAR FIELDS = DB.COLLECTION('ALLFIELDNAMES').DISTINCT('_ID');
    FIELDS .THEN(FUNCTION(DATA) {
      VAR FINALDATA = { "STATUS": "SUCCESS", "FIELDS": DATA };
      RES.SEND(FINALDATA);
      DELTECOLLECTION(DB, 'ALLFIELDNAMES');
    })
    .CATCH(FUNCTION(ERR) {
      RES.SEND(ERR);
      DELTECOLLECTION(DB, 'ALLFIELDNAMES');
    });
  });

Sau khi đọc Collection mới tạo "ALLFIELDNAMES", xóa nó.

DB.COLLECTION("ALLFIELDNAMES").REMOVE({}, FUNCTION (ERR,RESULT) { DB.CLOSE(); RETURN; });

Nhiều lựa chọn...

Bạn có rất nhiều Option lấy Mongo Keys này! Nếu bạn bị Overwhelmed bởi MongoDB Management và muốn Focus vào Code thay vì Database Management, chúng tôi ở đây hỗ trợ. Thử Database Platform và White Glove Support của chúng tôi miễn phí.